반응형
출처 : http://irmus.tistory.com/26

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
Posted by Real_G