이미지 출력에 대한 질문입니다
      글쓴이: ecstasy5001 / 작성시간: 수, 2005/07/13 - 1:39오후    
  
  제가 리눅스에서 이미지파일을 읽어서 화면에 출력하는
응용 프로그램을 만들어 볼라고 하는데.. 이곳저곳에서 찾아봐도
영상처리 포맷변환에 대해서만 나와있고 막상 이미지를 화면에
출력하는것은 안나와있어서 이렇게 도움을 요청합니다...
대략적으로(자세히 알려주심 더 감사하고여) 어느 라이브러리를 이용해서
어떤식으로 파일을 읽어다가 어떤식으로 화면에 출력하는지 알려주시면
감사하겠습니다..(C나 C++ 기반으로부탁드립니다)
Forums: 


gtk 등이라면 pixmap 으로 읽어들여서 screen 에 복사해다 넣
gtk 등이라면 pixmap 으로 읽어들여서 screen 에 복사해다 넣기만 하면 됩니다..
qt 도 비슷한게 있을 듯 하군요
gtk를 사용해보시려면 gtk-demo 를 돌려보세요 필요한 예제를 얻을 수 있을겁니다...
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
Qt의 경우라면..
qt의 경우라면 위의 태영님 말씀대로 pixmap 객체를 이용해서 간단하게 출력할 수 있습니다.
대신에 qt를 설치하실때에 jpeg, png나...등등 여러 포멧을 지원가능하도록 옵션을 넣어서 설치를 하셔야 할 겁니다.
허접하지만 qt를 이용할 경우 간단하게 이미지를 불러와 출력하는 코드입니다.
급하게 숙제로 작성했던 예제라 많이 부족하겠지만 도움이 되신다면 ^^;; 참고하세요.
아마 오렐리사의 qt책을 보시면 비슷한 소스 코드가 있을겁니다.
// Qt/E Header 파일 선언부 #include <qapplication.h> #include <qfiledialog.h> #include <qmenubar.h> #include <qmessagebox.h> #include <qpixmap.h> #include <qpopupmenu.h> #include <qscrollview.h> #include <qwidget.h> #include <qcursor.h> #include <qlabel.h> #include <qimage.h> // ViewArea Class 선언부 : 실제적으로 그림이 보여지는 부분 class ViewArea:public QWidget { Q_OBJECT; public: ViewArea(); // 생성자와 소멸자 ~ViewArea(); public slots: void slotLoad( const QString& ); // 그림파일을 불러오는 역할을 하는 SLOT protected: virtual void mousePressEvent( QMouseEvent* ); virtual void resizeEvent( QResizeEvent* ); private slots: void slotClearArea(); // Clear 역할을 하는 SLOT void slotSmall(); // 그림을 확대하는 SLOT void slotZoom(); // 그림을 축소하는 SLOT private: QPoint _last; QLabel* mylabel; // 그림이 로드되어지는 영역의 Widget QImage thisImage, scaleImage, zoomImage;// 원본이미지, 축소이미지, 확대이미지 QPixmap _buffer; // 이미지를 담아놓는 Pixmap형 버퍼 QPopupMenu* _popupmenu; // clear 팝업 메뉴 }; // ViewWindow Class 선언부 : 창을 구성하는 부분 class ViewWindow:public QWidget { Q_OBJECT; public: ViewWindow(); // 생성자와 소멸자 ~ViewWindow(); private slots: void slotLoad(); // 메뉴에서 Load를 선택했을 때의 SLOT void slotZoom(); // 메뉴에서 Zoom를 선택했을 때의 SLOT void slotSmall(); // 메뉴에서 Small를 선택했을 때의 SLOT void slotAbout(); // 메뉴에서 About를 선택했을 때의 SLOT signals: void load( const QString& ); // 파일을 로드하는 Signal void zoom(); // 그림이미지를 확대하는 Signal void small(); // 그림이미지를 축소하는 Signal protected: virtual void resizeEvent( QResizeEvent* ); private: QPopupMenu* _filemenu; // 창의 File 메뉴 객체 QPopupMenu* _scalemenu; // 창의 Scale 메뉴 객체 QPopupMenu* _aboutmenu; // 창의 About 메뉴 객체 QScrollView* _scrollview; // ScrollBar를 위한 객체 QMenuBar* _menubar; // 전체 메뉴바를 위한 객체 ViewArea* _viewarea; // Viewarea 객체 }; #include "pix.moc" // Signal과 SLOT을 위한 moc 파일 : Makefile 생성시에 생성 // ViewArea 생성자 코드 ViewArea::ViewArea() { _popupmenu = new QPopupMenu(); _popupmenu->insertItem( "&Clear", this, SLOT( slotClearArea() ) ); // 그림 영역에서 오른쪽 버튼 클릭시, Clear메뉴 생성 mylabel = new QLabel( this ); // Label 객체를 생성 } // ViewArea 소멸자 코드 ViewArea::~ViewArea() { delete _popupmenu; } // Clear메뉴를 클릭했을 때의 동작 코드 void ViewArea::slotClearArea() { scaleImage.reset(); zoomImage.reset(); thisImage.reset(); mylabel->clear(); } // Zoom Signal이 발생했을 때의 동작 코드 void ViewArea::slotZoom() { if( thisImage.isNull() ) QMessageBox::warning( 0, "Zoom error", "File not exist" ); else { zoomImage = thisImage.scale( thisImage.width(), thisImage.height(), QImage::ScaleMin );// 원본 이미지로 확대한다. _buffer.convertFromImage( zoomImage ); // 이미지를 Pixmap객체로 변환하여 buffer에 저장 mylabel->setPixmap( _buffer ); // buffer를 label에 등록 mylabel->resize( _buffer.size() ); // buffer 사이즈로 재조정 mylabel->show(); // label을 보여준다. } } // Small Signal이 발생했을 때의 동작 코드 void ViewArea::slotSmall() { if( scaleImage.isNull() ) QMessageBox::warning( 0, "Small error", "File not exist" ); else { _buffer.convertFromImage( scaleImage ); // 이미지를 Pixmap객체로 변환하여 buffer에 저장 mylabel->setPixmap( _buffer ); // buffer를 label에 등록 mylabel->resize( _buffer.size() ); // buffer 사이즈로 재조정 mylabel->setGeometry( 0, 0, scaleImage.width(), scaleImage.height() );//label의 위치를 왼쪽상단으로 조정한다. mylabel->show(); // label을 보여준다. } } // Small Signal이 발생했을 때의 동작 코드 void ViewArea::slotLoad( const QString& filename ) { if( ! thisImage.load( filename ) ) QMessageBox::warning( 0, "Load error", "Could not load file" ); scaleImage = thisImage.smoothScale( 600, 450, QImage::ScaleMin );//원본 이미지를 화면 비율에 맞게 축소한다. _buffer.convertFromImage( scaleImage ); // 축소된 이미지를 buffer에 저장 mylabel->setPixmap( _buffer ); // buffer를 label에 등록 mylabel->resize( _buffer.size() ); // buffer 사이즈로 재조정 mylabel->show(); // label을 보여준다. } // Mouse이벤트를 감지하는 코드 void ViewArea::mousePressEvent( QMouseEvent* event ) { if( event->button() == RightButton ) _popupmenu->exec( QCursor::pos() ); else { _last = event->pos(); } } void ViewArea::resizeEvent( QResizeEvent* event ) { QPixmap save( _buffer ); _buffer.resize( event->size() ); _buffer.fill( white ); bitBlt( &_buffer, 0 , 0, &save ); } // ViewWindow 생성자 : 메인 창을 생성하는 부분 ViewWindow::ViewWindow() { _filemenu = new QPopupMenu; // File 메뉴 _filemenu->insertItem( "&Open", this, SLOT( slotLoad() ) ); _filemenu->insertSeparator(); _filemenu->insertItem( "&Quit", qApp, SLOT( quit() ) ); _scalemenu = new QPopupMenu; // Scale 메뉴 _scalemenu->insertItem( "&Zoom", this, SLOT( slotZoom() ) ); _scalemenu->insertItem( "&Small", this, SLOT( slotSmall() ) ); _aboutmenu = new QPopupMenu; // About 메뉴 _aboutmenu->insertItem( "&Pix", this, SLOT( slotAbout() ) ); _menubar = new QMenuBar( this ); // 메뉴바에 각 메뉴 등록 _menubar->insertItem( "&File", _filemenu ); _menubar->insertItem( "&Scale", _scalemenu ); _menubar->insertSeparator(); _menubar->insertItem( "&About", _aboutmenu ); _scrollview = new QScrollView( this ); // 스크롤바 정의 _scrollview->setGeometry( 0, _menubar->height(), width(), height() - _menubar->height() ); _viewarea = new ViewArea(); _viewarea->setGeometry( 0, 0, 1280, 1024 ); _scrollview->addChild( _viewarea ); // 스크롤바를 viewarea에 등록 // 윈도우 객체에서 발생한 Signal을 처리하여 Viewarea에 SLOT에 넘겨주기 위한 connect 부분 QObject::connect( this, SIGNAL( load( const QString& ) ), _viewarea, SLOT( slotLoad( const QString& ) ) ); QObject::connect( this, SIGNAL( zoom() ), _viewarea, SLOT( slotZoom() )); QObject::connect( this, SIGNAL( small() ), _viewarea, SLOT( slotSmall() )); } // ViewWindow 소멸자 ViewWindow::~ViewWindow() { } void ViewWindow::resizeEvent( QResizeEvent* event ) { _scrollview->resize( event->size() ); _scrollview->setGeometry( 0, _menubar->height(), width(), height() - _menubar->height() ); } // 파일을 불러올 창을 만들고 load signal을 발생시킨다. void ViewWindow::slotLoad() { QString filename = QFileDialog::getOpenFileName( ".", "*", this ); if( !filename.isEmpty() ) emit load( filename ); } // Zoom 메뉴를 눌렀을 때 zoom signal 발생, 좌측상단으로 이미지 이동 void ViewWindow::slotZoom() { _scrollview->center( 0, 0 ); emit zoom(); } // Small 메뉴를 눌렀을 때 small siganl 발생, 좌측상단으로 이미지 이동 void ViewWindow::slotSmall() { _scrollview->center( 0, 0 ); emit small( ); } // About 메뉴를 눌렀을 때 뜨는 messagebox void ViewWindow::slotAbout() { QMessageBox::information( this, "About Pix", "This is the simple image viewer application based Qt/E.\n" ); } // Main 함수 int main( int argc, char* argv[] ) { QApplication myapp( argc, argv ); // application 객체 생성 ViewWindow* mywidget = new ViewWindow(); // ViewWindow형 widget 생성 mywidget->setGeometry( 0, 0, 640, 480 ); // 창의 크기 조절 myapp.setMainWidget( mywidget ); // 메인 widget으로 등록 mywidget->show(); // widget을 보여줌 return myapp.exec(); // 제어권을 qt로 이행 }언제즘 제대로 된 프로그램 하나 만들 수 있을까?
OTL....
나도 이글루 한다~~^0^
http://maxcrom.egloos.com
댓글 달기