img2py wxPython에서 이미지를 파일에 포함하기
How to embed image files into a python source??
python으로 GUI 프로그램을 짜다가 윈도 아이콘을 넣고싶을 때, 보통이라면 그냥 ico파일 만들어 wxFrame.SetIcon()으로 지정하면 된다. 하지만 간단한 유틸리티성격의 GUI 프로그램이라 딱 하나의 파일로 만들고 싶은 경우라면? 이미지 파일을 파이썬 소스로 변환해서 소스 파일내에 내장시킬 수 있다.
wxPython에서 제공하는 img2py 유틸리티를 이용해 보자.
import sys
from wx.tools import img2py
arg = '-i MyIcon.ico MyIcon.py'
img2py.main(arg.split())
위와같이 사용하면 MyIcon.ico 파일을 MyIcon.py 파일로 변환시켜준다. 사용 목적에 따라 MyIcon.py 파일을 import해서 쓰거나 다른 소스 파일 내에 내용물을 복사해서 쓰면 되겠다...
참고로 arg에 -i 를 넣은 것은 이 파일이 icon 으로 쓰일 것이기 때문이다. -i 옵션을 주면 getIcon() 이라는 함수가 만들어진다.
-i 말고도 다양한 옵션이 있으니 help(img2py) 해서 읽어보도록 하자.
출처 : http://ryzel.springnote.com/pages/252557
img2py.py는 이미지 파일을 소스코드 내에 포함시키기 위하여 소스코드로 변환시켜준다.
img2py.py는 wxPython을 설치해야 사용할 수 있다.
파일의 위치는 \Lib\site-packages\wx-2.6-msw-unicode\wx\tools 아래에 존재한다. (wxPython 2.6 버전)
<Option>
img2py.py -- Convert an image to PNG format and embed it in a Python
module with appropriate code so it can be loaded into
a program at runtime. The benefit is that since it is
Python source code it can be delivered as a .pyc or
'compiled' into the program using freeze, py2exe, etc.
Usage:
img2py.py [options] image_file_name python_file
Options:
-m <#rrggbb> If the original image has a mask or transparency defined
it will be used by default. You can use this option to
override the default or provide a new mask by specifying
a colour in the image to mark as transparent.
-n <name> Normally generic names (getBitmap, etc.) are used for the
image access functions. If you use this option you can
specify a name that should be used to customize the access
fucntions, (getNameBitmap, etc.)
-c Maintain a catalog of names that can be used to reference
images. Catalog can be accessed via catalog and index attributes
of the module. If the -n <name> option is specified then <name>
is used for the catalog key and index value, otherwise
the filename without any path or extension is used as the key.
-a This flag specifies that the python_file should be appended
to instead of overwritten. This in combination with -n will
allow you to put multiple images in one Python source file.
-u Don't use compression. Leaves the data uncompressed.
-i Also output a function to return the image as a wxIcon.
<사용 예제> - Icon
' -i' 옵션은 아이콘 이미지를 소스코드로 변환할 때 사용한다.
img2py.py -i 'icon_file_name' 'result_file_name'
변환이 정상적으로 이루어졌을 경우 다음과 같은 메시지를 출력한다.
Embedded 'icon_file_name' into 'result_file_name'
'result_file_name'에 생성된 결과는 다음과 같다.
######################################################################################
#----------------------------------------------------------------------
# This file was generated by C:\Python24\Lib\site-packages\wx-2.6-msw-unicode\wx\tools\img2py.py
#
from wx import ImageFromStream, BitmapFromImage
from wx import EmptyIcon
import cStringIO, zlib
def getData():
return zlib.decompress(
'x\xda\x01\x1d\r\xe2\xf2\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\
\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\
\x08d\x88\x00\x00\x0c\xd4IDATX\x85=\x97yx\xd4\xf5\xd5\xc5?\xbfe\xf6\xccLf\
\x12\xb2/\x10\x12 \x10\x02\x88\x12\xc5\xb0\x15\x04)\x10\x14E\xaa\xa5\xf0\xbc\
.
.
.
.
\x8d|\xb8\xf0.\xe6U\x1c\xe7\xf7G\x8e\xf0\xfd\xc1\x83\x9c\xdf\xb1\x83\xa4\xa2\
"\xc6,_\x893=\x9d\xff\x00\xfdf\xc8e\'\x1c\x07#\x00\x00\x00\x00IEND\xaeB`\x82\
+l6\x8d' )
def getBitmap():
return BitmapFromImage(getImage())
def getImage():
stream = cStringIO.StringIO(getData())
return ImageFromStream(stream)
def getIcon():
icon = EmptyIcon()
icon.CopyFromBitmap(getBitmap())
return icon
######################################################################################
getIcon() 함수를 호출하여 icon 이미지를 사용할 수 있다.
주의점: 'result_file_name'을 지정할 때 현재 작업중인 파일을 지정하면 안됨.
결과를 생성할 때 'result_file_name'의 내용을 날려버리고 새로 작성됨.
<사용 예제> - jpg or bmp etc..
-n <name> 옵션은 이미지 파일(jpg, bmp, ...)을 소스코드로 변환 할 때 사용한다.
<name>은 생성된 결과의 함수 이름으로 사용된다. 이미지 파일의 이름을 사용하면 편리함.
(이해가 잘 안되면 생성된 결과의 가장 마지막 함수의 이름을 확인하면 금방 이해할 수 있음.)
실제 입력 할 때 '<>'는 붙이면 안됨. 안됨 -_-;
img2py.py -n 함수이름 'image_file_name' 'result_file_name'
변환이 정상적으로 이루어졌을 경우 다음과 같은 메시지를 출력한다.
Embedded 'image_file_name' using "함수이름" into 'result_file_name'
'result_file_name'에 생성된 결과는 다음과 같다.
######################################################################################
#----------------------------------------------------------------------
# This file was generated by C:\Python24\Lib\site-packages\wx-2.6-msw-unicode\wx\tools\img2py.py
#
from wx import ImageFromStream, BitmapFromImage
import cStringIO, zlib
def get'함수이름'Data():
return zlib.decompress(
'x\xda4\x9auP\x1b\xdf\xfb\xb6\x13\x8a\x04Op\x97 E\x82K\xb1R$P\xf8\xe0\x85\
\xe0\xee.\xc5\xb58\xc1\x0b\x14w\x87\xe0.\xc5)R\xdc\xb5X)nEZ\x8a\x95\xb7\xdf\
\xdf\xcc\xfb\xd7\xce\xec\xcc\xce\xce\x9c\xd9\xe7\xba\xaf\xfb\xec\x89VW}\x8b\
.
.
.
.
m\x1ec\x19\xfbq\xd1\xfdO8m\x90\x8bL\xeeu]\x97*Q\x03\x1f\xbcy\xfe\x7fz\xa9,\
\x0ex\xcf+\xf7\x00\x00\x00\x00IEND\xaeB`\x82\xa0\xdd}\x0f' )
def get'함수이름'Bitmap():
return BitmapFromImage(get'함수이름'Image())
def get'함수이름'Image():
stream = cStringIO.StringIO(get'함수이름'Data())
return ImageFromStream(stream)
######################################################################################
get'함수이름'Image() 함수를 호출하여 이미지를 사용할 수 있다.
주의점: 'result_file_name'을 지정할 때 현재 작업중인 파일을 지정하면 안됨.
결과를 생성할 때 'result_file_name'의 내용을 날려버리고 새로 작성됨.
'Python' 카테고리의 다른 글
django 실습 (0) | 2008.12.13 |
---|---|
ubuntu에서 django 설치 (0) | 2008.11.29 |
트레이 아이콘 (0) | 2008.11.25 |