Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import png, struct, os, math, pdb
- import sys
- xy = True #Set to false for yx swizzle order
- def chunks(l, n):
- """Yield successive n-sized chunks from l."""
- for i in range(0, len(l), n):
- yield l[i:i + n]
- def unswizzle(writebuf, readbuf, writeoffset, segwidth, segheight, datawidth):
- global readoffset, buffer
- ## print(segwidth, segheight)
- if segwidth == 2 and segheight == 2:
- if xy:
- writebuf[writeoffset:writeoffset+8] = readbuf[readoffset:readoffset+8]
- writebuf[writeoffset + datawidth:writeoffset + datawidth + 8] = readbuf[readoffset + 8:readoffset + 16]
- else:
- writebuf[writeoffset:writeoffset+4] = readbuf[readoffset:readoffset+4]
- writebuf[writeoffset + datawidth:writeoffset + datawidth+4] = readbuf[readoffset+4:readoffset+8]
- writebuf[writeoffset+4:writeoffset+8] = readbuf[readoffset+8:readoffset+12]
- writebuf[writeoffset + datawidth + 4:writeoffset + datawidth + 8] = readbuf[readoffset+12:readoffset+16]
- readoffset += 16
- else:
- if xy:
- unswizzle(writebuf, readbuf, writeoffset, segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + segwidth * 4 // 2, segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + datawidth * (segheight // 2), segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + datawidth * (segheight // 2) + segwidth * 4 // 2, segwidth // 2, segheight // 2, datawidth)
- else:
- unswizzle(writebuf, readbuf, writeoffset, segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + datawidth * (segheight // 2), segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + segwidth * 4 // 2, segwidth // 2, segheight // 2, datawidth)
- unswizzle(writebuf, readbuf, writeoffset + datawidth * (segheight // 2) + segwidth * 4 // 2, segwidth // 2, segheight // 2, datawidth)
- with open('ch01.png.phyre', 'rb') as f:
- f.seek(0xF8F)
- bitmap = f.read()
- width = 1024
- height = 1024
- buffer = bytearray(len(bitmap)) #Output buffer
- readoffset = 0 #Input position counter
- if width == height:
- unswizzle(buffer, bitmap, 0, width, height, width * 4)
- elif width > height:
- for w in range(0, width, height):
- unswizzle(buffer, bitmap, w, height, height, width * 4)
- elif height > width:
- for h in range(0, height * width, width ** 2):
- unswizzle(buffer, bitmap, h, width, width, width * 4)
- else:
- print('error')
- p = list(chunks(buffer, width * 4))
- with open('output1.png', 'wb') as f:
- w = png.Writer(width, height, alpha=True)
- w.write(f, p)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement