게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[루아 이야기] 5. 이미지 뷰어를 만들어 보아..요... ^^;
게시물ID : programmer_1353짧은주소 복사하기
작성자 : 달빛연구자
추천 : 8
조회수 : 640회
댓글수 : 4개
등록시간 : 2014/02/21 00:44:50
안녕하세요.
달빛연구자 입니다.

 이번 화에서는 이미지 뷰어를 만들어 볼 거에요. 
이미지 뷰어라는 것은 한마디로 말하면, 컴퓨터로 그림을 볼 수 있게 하는 프로그램이에요.
그림파일을 열어서 볼 수 있는 프로그램이죠..

일단은 소스코드를 보도록 할..게요.. (흠칫..)
이미지뷰어.png

짠~!
와 간단하죠? 53 라인밖에 안되요.. 정말 간단하죠? 자자.. 일단 들고계신 짱돌들 내려 놓으시고요;;

사실 이번 화는 제가 난이도 조절에 실패해 버렸어요 (덜덜..)
별 생각없이 저번화에서 텍스트 뷰어를 했으니 이번화에서는 이미지 뷰어를 만들면 적당하겠다 싶어서 만들다보니... 코드는 복잡해져가고,,
이건 아니다 싶어서 주제를 바꾸려고 하니 시간이 12시가 다 되어 가더군요..;;

하하.. 그래도 엄청나게 어려운 것은 아니고요. 생소한 개념 몇가지가 들어 있을 뿐 이에요.
한 줄씩 천천히 분석을 해 보도록 할께요.

1 - 5번 라인 : 이미지와 IUP 관련 라이브러리를 요청하는 부분이에요. 이 부분이 있어야 IUP와 이미지 관련 함수들을 쓸 수 있답니다. :)

7번 라인 : 이제는 익숙한 iup.GetFile() 함수에요. 열기창을 만들어 주고, 우리가 선택한 파일의 경로를 변수에 저장해 주는 함수 입니다.
 여기에서는 우리가 열어볼 그림파일을 찾기 위해 사용 되었어요.
 참.. 그러고 보니 함수라는 개념을 설명하지 않았네요. 
프로그래밍에서 함수라는 것은, 하나의 이름으로 묶여 있는 코드 덩어리라고 할 수 있어요.
 프로그램의 내부에서는 반복적으로 사용되는 코드들이 많이 있는데요. 일단 한번 저렇게 함수로 만들어 두면, 사용을 할 때에는 함수의 이름만 알면
그 기능을 사용할 수 있어서 무척이나 편리하답니다.?

11번 라인 : image = im.FileImageLoadBitmap(file_name) 함수가 호출이 되었어요. 
이 함수는 우리가 열기 원하는 그림 파일의 경로를 넣어주면, 그림파일의 압축을 풀고 읽어들여서 변수에 저장해 주는 역할을 해요.
BMP파일 뿐만 아니라 PNG, JPEG 까지 지원을 하니 우리가 원하는 그림파일은 대부분 열수 있는 신통방통한 함수랍니다.

15 - 35번 라인은 Canvas(캔버스)라는 것을 사용하는 부분이에요.
캔버스라는 것은 말 그대로, 윈도우 창에 그림을 그릴 수 있는 화첩같은 역할을 하는 컨트롤 이에요. 
이미지의 출력은 다양한 상황(이벤트)에 대응해야 하기 때문에, 캔버스의 경우에도 대부분의 동작을 콜백함수라는 것으로 만들어 주어야 해요.

 콜백함수라는 것은 간단히 설명하면, 특정한 상황에 자동으로 호출되는 함수가 정해져 있고 그 함수의 내용을 우리가 마음대로 만들 수 있도록 분리해 놓은 것을 의미해요..  실제 개념은 설명보다 조금 더 복잡하기 때문에, 일단은 그냥 이런 형식이 있구나 하고 넘어가시면 됩니다.
 (소스는 그냥 그대로 배끼시면 되요..; 어차피 전문가들도 다~ 베껴씁니....(퍽))

37번 라인부터는 우리가 화면에 띄울 다이얼로그를 생성하고 다이얼로그의 콜백함수를 작성하는 부분입니다.
 
47번 라인은 방금 만들어진 다이얼로그에 아까 만들어 놓았던 캔버스를 등록해 주는 부분이고요.
48번 라인은 이 다이얼로그에 11번 라인에서 저장해 둔 이미지를 등록해 주는 부분 이에요.

이렇게 각 부분을 연결해 주었으니, 다이얼로그를 동작시키면, 다이얼로그 위에서 캔버스를 통해 이미지가 나타날 거예요.
50번 라인에서 다이얼로그를 화면에 보이도록 하고요.
51번 라인에서 다이얼로그를 동작시켜 줍니다.

이렇게 코드를 작성하고 이 코드를 파일명.wlua로 저장한 뒤 실행을 하면...

이미지뷰어 열기.png


이미지 뷰어 동작.png

이와 같이 동작을 하게 되죠...
정말 멋진 이미지.... 뷰어 입니다. 하하하
참 쉽죠? (퍽퍽..)

갑작스럽게 코드가 확 어려워져서 아마 당황스러우실 것 같네요. ( 제 불찰입니다 ㅠㅠ )
하지만 소스코드를 천천히 뜯어보면, 아주 이해하지 못할 코드는 아니랍니다.

소스 코드를 첨부할께요.. 긁어다 붙이면 그대로 동작을 합니다.
글을 쓰면서 발견한 것인데요... 스크린 샷에 있는 코드의 33,34 번은 프로그램에 필요 없는 라인이네요 ㅠㅠ;
코드를 날림으로 짜다보니 이런일이 있습니다.
첨부한 소스에서는 해당 라인을 삭제 하였습니다.
-- ImgViewer.wLua
require"imlua"
require"cdlua"
require"cdluaim"
require"iuplua"
require"iupluacd"

file_name, err = iup.GetFile("*.*")
if err ~= 0 then  return end

--load image
local image, err = im.FileImageLoadBitmap(file_name)
if not image then error(im.ErrorStr(err))
end

--canvas
cnv = iup.canvas{}
function cnv:action()
local canvas = dlg.canvas
local image = dlg.image

canvas:Activate()
canvas:Clear()
image:cdCanvasPutImageRect(canvas, 0, 0, 0, 0, 0, 0, 0, 0)
canvas:Flush()

return iup.DEFAULT
end
function cnv:resize_cb(w, h)
self.dx = w
self.dy = h
end
cnv.rastersize = string.format("%dx%d", image:Width(), image:Height())

--dialog
dlg = iup.dialog{cnv}
function dlg:close_cb()
if canvas then self.canvas:Kill() end
if image then self.image:Destroy() end
return iup.CLOSE
end
function dlg:map_cb()
self.canvas = cd.CreateCanvas(cd.IUP, self.cnv)
end
dlg.title = file_name
dlg.cnv = cnv
dlg.image = image

dlg:show()
iup.MainLoop()

return

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호