Code:
from struct import pack
def image2icon(fn, img_list, rom = False):
try:
fp = open(fn, 'wb')
except Exception, inst:
traceback.print_exc()
return False
if rom == False:
fp.write(pack('LLLL',0x10000037,0x10000042,0x0,0x47396439)) #MBM UIDs
fp.write(pack('L',20)) #offset to image table
else:
fp.write(pack('L',0x10000041)) #ROM/Clip art MBM UID
fp.write(pack('L',len(img_list))) #num images
image_offset_list = fp.tell()
i = 0
while i < len(img_list):
fp.write(pack('L',0)) #dummy offset
i = i + 1
n = 0
if rom:
offset = 8 + (len(img_list)*4)
else:
offset = 24 + (len(img_list)*4)
for img in img_list:
(w,h) = img.size
fp.seek(image_offset_list + (n*4))
fp.write(pack('L', offset)) #offset to image n
fp.seek(offset)
n = n + 1
if rom:
if img.mode == '1':
fp.write(pack('L',0x10000040)) # Clip art stuff
fp.write(pack('L',0x01))
fp.write(pack('L',0))
fp.write(pack('L',0))
fp.write(pack('L',0x04))
else:
fp.write(pack('L',0x10000040)) # Clip art stuff
fp.write(pack('L',0x08))
fp.write(pack('L',0))
fp.write(pack('L',0))
fp.write(pack('L',0x60))
size_offset = fp.tell()
fp.write(pack('L',0)) #size of section - temporary
fp.write(pack('L',40)) #offset to image data
fp.write(pack('L',w))
fp.write(pack('L',h))
fp.write(pack('L',0)) # twips x
fp.write(pack('L',0)) # twips y
if img.mode == 'RGB':
fp.write(pack('L',24)) # bpp
fp.write(pack('L',1)) # colour
fp.write(pack('L',0)) # ??
fp.write(pack('L',0)) # encoding - no RLE
if rom:
fp.write(pack('L',0xffffffff)) # CA
fp.write(pack('L',0x44)) # CA
row_sz = w
if w%4:
row_sz = w + (4 - w%4)
data_size = 40 + (3 * h * row_sz)
if rom:
data_size = data_size + 28 # CA has 7 extra ints
row = 0
while row < h:
c = 0
while c < w:
rgb = img.getpixel((c,row))
fp.write(pack('B',rgb[0][2]))
fp.write(pack('B',rgb[0][1]))
fp.write(pack('B',rgb[0][0]))
c = c + 1
while c < row_sz:
fp.write(pack('B', 0))
c = c + 1
row = row + 1
elif img.mode == '1':
fp.write(pack('L',1)) # bpp
fp.write(pack('L',0)) # colour - black & white
fp.write(pack('L',0)) # ??
fp.write(pack('L',0)) # encoding - no RLE
if rom:
fp.write(pack('L',0xffffffff)) # CA
fp.write(pack('L',0x44)) # CA
row_sz = w
if w%32:
row_sz = w + (32 - w%32)
data_size = 40 + (h * row_sz/8)
if rom:
data_size = data_size + 28 # CA has 7 extra ints
row = 0
while row < h:
c = 0
word = 0
bit_offset = 0
while c < w:
rgb = img.getpixel((c,row))
if rgb[0][0] <> 0:
word = word | (1<<bit_offset)
bit_offset = bit_offset + 1
if bit_offset == 32:
fp.write(pack('L', word))
bit_offset = 0
word = 0
c = c + 1
if c < row_sz:
fp.write(pack('L', word))
row = row + 1
offset = offset + data_size
fp.seek(size_offset)
if rom:
fp.write(pack('L',data_size - 28)) #size of section minus extra CA bits
else:
fp.write(pack('L',data_size)) #size of section
fp.close()
return True