71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
import zlib, os
|
||
|
import struct
|
||
|
|
||
|
import Image, ImageDraw
|
||
|
|
||
|
lod = open("H3bitmap.lod")
|
||
|
lod.seek(8)
|
||
|
files_count = struct.unpack("i", lod.read(4))[0]
|
||
|
files=[]
|
||
|
for file in range(2745,2793):
|
||
|
lod.seek(92+(file*32))
|
||
|
name = lod.read(16).split("\0")[0]
|
||
|
offset = struct.unpack("i", lod.read(4))[0] #offset
|
||
|
size_orig = struct.unpack("i", lod.read(4))[0] #size_original
|
||
|
type = struct.unpack("i", lod.read(4))[0] #type
|
||
|
size_comp = struct.unpack("i", lod.read(4))[0] #size_compressed
|
||
|
|
||
|
lod.seek(offset)
|
||
|
|
||
|
if size_comp:
|
||
|
pcx = zlib.decompress(lod.read(size_comp))
|
||
|
else:
|
||
|
pcx = lod.read(size_orig)
|
||
|
|
||
|
if type == 16:
|
||
|
size = struct.unpack("i", pcx[:4])[0]
|
||
|
width = struct.unpack("i", pcx[4:8])[0]
|
||
|
height = struct.unpack("I", pcx[8:12])[0]
|
||
|
print file, name, width, height
|
||
|
|
||
|
im = Image.new("RGBA", (width, height))
|
||
|
draw = ImageDraw.Draw(im)
|
||
|
bla=[]
|
||
|
for i in range(256):
|
||
|
bla.append((ord(pcx[12+size+i*3]),ord(pcx[12+size+i*3+1]),ord(pcx[12+size+i*3+2])))
|
||
|
|
||
|
for i in range(size):
|
||
|
a =ord(pcx[12+i])
|
||
|
if bla[a] == (0,255,255):
|
||
|
draw.point((i-int(i/width)*width,int(i/width)), fill=(0,0,0,0))
|
||
|
else:
|
||
|
draw.point((i-int(i/width)*width,int(i/width)), fill=bla[a])
|
||
|
im.save(' '.join([str(file),name]), "PNG")
|
||
|
elif type == 17:
|
||
|
size = struct.unpack("i", pcx[:4])[0]
|
||
|
width = struct.unpack("i", pcx[4:8])[0]
|
||
|
height = struct.unpack("I", pcx[8:12])[0]
|
||
|
print file, name, width, height
|
||
|
|
||
|
im = Image.new("RGB", (width, height))
|
||
|
draw = ImageDraw.Draw(im)
|
||
|
|
||
|
for i in range(size/3):
|
||
|
if ord(pcx[12+i*3]) == 0 and ord(pcx[13+i*3]) == 255 and ord(pcx[14+i*3]) == 255:
|
||
|
draw.point((i-int(i/width)*width,int(i/width)), fill=(0,0,0,0))
|
||
|
else:
|
||
|
draw.point((i-int(i/width)*width,int(i/width)), fill=(ord(pcx[12+i*3]),ord(pcx[13+i*3]),ord(pcx[14+i*3])))
|
||
|
im.save(' '.join([str(file),name]), "PNG")
|
||
|
elif type in (1, 2, 64, 65, 66, 67, 68, 69, 70, 71, 73, 79, 80, 96):
|
||
|
print file, name
|
||
|
file = open(' '.join([str(file),name]), "w")
|
||
|
file.write(pcx)
|
||
|
file.close()
|
||
|
else:
|
||
|
print i, name, type
|
||
|
sys.exit("not supported %d"%type)
|
||
|
|
||
|
lod.close()
|