이미지 출력에 대한 질문입니다

ecstasy5001의 이미지

제가 리눅스에서 이미지파일을 읽어서 화면에 출력하는

응용 프로그램을 만들어 볼라고 하는데.. 이곳저곳에서 찾아봐도

영상처리 포맷변환에 대해서만 나와있고 막상 이미지를 화면에

출력하는것은 안나와있어서 이렇게 도움을 요청합니다...

대략적으로(자세히 알려주심 더 감사하고여) 어느 라이브러리를 이용해서

어떤식으로 파일을 읽어다가 어떤식으로 화면에 출력하는지 알려주시면

감사하겠습니다..(C나 C++ 기반으로부탁드립니다)

정태영의 이미지

gtk 등이라면 pixmap 으로 읽어들여서 screen 에 복사해다 넣기만 하면 됩니다..
qt 도 비슷한게 있을 듯 하군요

gtk를 사용해보시려면 gtk-demo 를 돌려보세요 필요한 예제를 얻을 수 있을겁니다...

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

내삶의런치의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.