+app = None
+DEFAULT_APPEND = False
+DEFAULT_COMPRESSED = True
+DEFAULT_MASKCLR = None
+DEFAULT_IMGNAME = ""
+DEFAULT_ICON = False
+DEFAULT_CATALOG = False
+
+#THIS IS USED TO IDENTIFY, IN THE GENERATED SCRIPT, LINES IN THE FORM "index.append('Image name')"
+indexPattern = re.compile(r"\s*index.append\('(.+)'\)\s*")
+
+def img2py(image_file, python_file, append=DEFAULT_APPEND, compressed=DEFAULT_COMPRESSED, maskClr=DEFAULT_MASKCLR, imgName=DEFAULT_IMGNAME, icon=DEFAULT_ICON, catalog=DEFAULT_CATALOG):
+ """
+ Converts an image file to a data structure written in a Python file
+ --image_file: string; the path of the source image file
+ --python_file: string; the path of the destination python file
+ --other arguments: they are equivalent to the command-line arguments
+ """
+ global app
+ if not wx.GetApp():
+ app = wx.PySimpleApp()
+
+ # convert the image file to a temporary file
+ tfname = tempfile.mktemp()
+ try:
+ ok, msg = img2img.convert(image_file, maskClr, None, tfname, wx.BITMAP_TYPE_PNG, ".png")
+ if not ok:
+ print msg
+ return
+
+ data = open(tfname, "rb").read()
+ data = crunch_data(data, compressed)
+ finally:
+ if os.path.exists(tfname):
+ os.remove(tfname)
+
+
+ old_index = []
+ if catalog and append:
+ # check to see if catalog exists already (file may have been created
+ # with an earlier version of img2py or without -c option)
+ pyPath, pyFile = os.path.split(python_file)
+
+ append_catalog = True
+
+ sourcePy = open(python_file, "r")
+ try:
+ for line in sourcePy:
+
+ if line == "catalog = {}\n":
+ append_catalog = False
+ else:
+ lineMatcher = indexPattern.match(line)
+ if lineMatcher:
+ old_index.append(lineMatcher.groups()[0])
+ finally:
+ sourcePy.close()
+
+
+ if append_catalog:
+ out = open(python_file, "a")
+ try:
+ out.write("\n# ***************** Catalog starts here *******************")
+ out.write("\n\ncatalog = {}\n")
+ out.write("index = []\n\n")
+ out.write("class ImageClass: pass\n\n")
+ finally:
+ out.close()
+
+
+
+ if append:
+ out = open(python_file, "a")
+ else:
+ out = open(python_file, "w")
+
+ try:
+ if catalog:
+ imgPath, imgFile = os.path.split(image_file)
+
+ if not imgName:
+ imgName = os.path.splitext(imgFile)[0]
+ print "\nWarning: -n not specified. Using filename (%s) for catalog entry." % imgName
+
+ out.write("#" + "-" * 70 + "\n")
+ if not append:
+ out.write("# This file was generated by %s\n#\n" % sys.argv[0])
+ out.write("from wx import ImageFromStream, BitmapFromImage, EmptyIcon\n")
+ if compressed:
+ out.write("import cStringIO, zlib\n\n\n")
+ else:
+ out.write("import cStringIO\n\n\n")
+
+ if catalog:
+ out.write("catalog = {}\n")
+ out.write("index = []\n\n")
+ out.write("class ImageClass: pass\n\n")
+
+ if compressed:
+ out.write("def get%sData():\n"
+ " return zlib.decompress(\n%s)\n\n"
+ % (imgName, data))
+ else:
+ out.write("def get%sData():\n"
+ " return \\\n%s\n\n"
+ % (imgName, data))
+
+
+ out.write("def get%sBitmap():\n"
+ " return BitmapFromImage(get%sImage())\n\n"
+ "def get%sImage():\n"
+ " stream = cStringIO.StringIO(get%sData())\n"
+ " return ImageFromStream(stream)\n\n"
+ % tuple([imgName] * 4))
+ if icon:
+ out.write("def get%sIcon():\n"
+ " icon = EmptyIcon()\n"
+ " icon.CopyFromBitmap(get%sBitmap())\n"
+ " return icon\n\n"
+ % tuple([imgName] * 2))
+
+ if catalog:
+ if imgName in old_index:
+ print "Warning: %s already in catalog." % imgName
+ print " Only the last entry will be accessible.\n"
+ old_index.append(imgName)
+ out.write("index.append('%s')\n" % imgName)
+ out.write("catalog['%s'] = ImageClass()\n" % imgName)
+ out.write("catalog['%s'].getData = get%sData\n" % tuple([imgName] * 2))
+ out.write("catalog['%s'].getImage = get%sImage\n" % tuple([imgName] * 2))
+ out.write("catalog['%s'].getBitmap = get%sBitmap\n" % tuple([imgName] * 2))
+ if icon:
+ out.write("catalog['%s'].getIcon = get%sIcon\n" % tuple([imgName] * 2))
+ out.write("\n\n")
+
+
+ if imgName:
+ n_msg = ' using "%s"' % imgName
+ else:
+ n_msg = ""
+
+ if maskClr:
+ m_msg = " with mask %s" % maskClr
+ else:
+ m_msg = ""
+
+ print "Embedded %s%s into %s%s" % (image_file, n_msg, python_file, m_msg)
+ finally:
+ out.close()
+