2014년 1월 22일 수요일

프로젝트 1차적 완료


1차적으로 완료해서 친구들에게 뿌려준 뒤 1차적으로 버그를 잡았다.

UI는 기능을 구현하고 나서 새롭게 프로그램을 만들어야 할듯 ㅠ

일단은 여기서 기능을 추가해야 될듯하다.



Qt의 static build가 어려웠었다 ㅠㅠ








2014년 1월 14일 화요일

Qt 이미지 출력


Qt에서 이미지 출력하는 방법

보통 QLabel에 출력하는 방법을 많이 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QPixmap>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString img_path = "C:/AMD/SDC11388.JPG";
    QImage img(img_path);    
    QPixmap buf = QPixmap::fromImage(img);
 
    ui->label->setPixmap(buf);
    ui->label->resize(buf.width(), buf.height());
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 



QGraphicsView에 출력하는 방법도 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QPixmap>
#include <QGraphicsView>
#include <QGraphicsScene>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QString img_path = "C:/AMD/SDC11388.JPG";
    QImage img(img_path);    
    QPixmap buf = QPixmap::fromImage(img);
    
    buf = buf.scaled(1024,1024);
 
 
    QGraphicsScene* scene = new QGraphicsScene;
    ui->graphicsView->setScene(scene);
 
    scene->addPixmap(buf);
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 


2014년 1월 10일 금요일

프로젝트의 시작 - Domino 이미지 이어붙이기


간단하게 이미지를 불러와서 이어붙이는 프로그램을 만들어 보고 있다.


예전에 나도 한번 이어붙이는 작업을 해봤는데 포토샵으로는 너무 힘들었던 기억이 있어서 좀더 쉽게 했으면 좋겠다는 조그마한 바람에서 프로그램을 만드는 계기가 되었다.


QT를 공부하고 있으니, QT로 만들어서 *nix, Window 두군데서 모두 사용할 수 있는 프로그램이 목적이다.


사실 이건 12월 중순부터 생각했었는데 QT에 대해 공부하느라 조금 늦어지고 있다.


대략적인 디자인을 아이튠즈같이 해서 꾸며놨는데...

아이튠즈 스타일..?

내가 구현하기에는 너무나 힘들었다 ㅠㅠ



그래서 방향을 조금 틀어...

기본적인 윈도우 탐색기처럼 구현하기로 했다.


그런데 기본적인 탐색기라고 생각했는데 구현중 고려할게 많았다.

간단하게

사용자가 TreeView에서 디렉토리를 선택한다 → 선택한 디렉토리의 파일들을 읽는다 → 이미지 파일을 확장자로 필터링하고 읽을 수 있는 이미지 리스트를 생성한다 → ListModel에  이미지를 읽어 파일이름과 Icon을 출력한다. → ListView에 ListModel을 적용시킨다.


1. 속도
2. 메모리

첫번째는 이미지가 크면 불러오는 시간이 길다. 그러므로 디렉토리를 선택하면 썸네일을 생성해야 되는게 아닐까??
하지만 썸네일도 이미지로부터 읽어오는 것인데, 캐싱하지 않는 이상은 속도가 똑같지 않을까? 
EXIF포맷에 썸네일이 있어요!!
EXIF포맷이 썸네일을 따로 저장하지만 모든 이미지 포맷이 썸네일을 꼭 저장하지는 않으므로...

당근을 조그맣게 만드려면 썰어야 하는수밖에..??
이미지 출처 http://season4.tistory.com/m/post/view/id/253




두번째는 메모리 관리다. 만약 이미지가 만장이 있다면 메모리를 어떻게 관리해야할까?
지금처럼 무작정 한다면 메모리가 넉넉한 PC에서도 죽게 될것이다.
이 문제는 스마트폰에서도 자주 접하게 되는데, 트위터나 페이스북같이 이미지+텍스트가 많을때는 사용자에게 보이는 부분만 읽어와서 그려주면 된다고 하더라...
이걸보고 ViewHolder패턴이라고 한다.



문제되는 점
지금은 이미지 리스트를 생성하고 Listitem을 하나하나 파일에서 읽어와서 ListModel 추가하고 마지막으로 View를 업데이트 하는 방식으로 되어있다.
지금 이 때의 문제는 고해상도 이미지 파일을 읽을 때이다. 만약 디렉토리에 100개 이상의 고해상도 이미지 파일이 있다면 ListModel에 모두 추가하기전까지는 View에 업데이트가 되지 않을 것이다.
지금 현재 이 문제를 겪고 있고, 해결해야 하는 제일 첫번째 문제점이다.
Model/View 프로그래밍을 다시 생각해 볼 시간인듯하다.

진행하다보니 쉽게 생각했던 프로젝트가 여러가지 고민거리를 안겨준다.