Last active
August 13, 2018 13:27
-
-
Save SamusAranX/ff95b3a62f97a0f0c39e08d326c18b1f to your computer and use it in GitHub Desktop.
Put this into the same directory as the encoded PNG files and execute the script.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#--- | |
# iPIN - iPhone PNG Images Normalizer v1.0 | |
# Copyright (C) 2007 | |
# | |
# Author: | |
# Axel E. Brzostowski | |
# http://axelbrz.com/ | |
# [email protected] | |
# | |
# References: | |
# http://iphone.fiveforty.net/wiki/index.php/PNG_Images | |
# http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html | |
# | |
# This program is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 3 of the License. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
#--- | |
from struct import * | |
from zlib import * | |
from glob import glob | |
import stat | |
import sys | |
import os | |
def getNormalizedPNG(filename): | |
pngheader = "\x89PNG\r\n\x1a\n" | |
file = open(filename, "rb") | |
oldPNG = file.read() | |
file.close() | |
if oldPNG[:8] != pngheader: | |
return None | |
newPNG = oldPNG[:8] | |
chunkPos = len(newPNG) | |
# For each chunk in the PNG file | |
while chunkPos < len(oldPNG): | |
# Reading chunk | |
chunkLength = oldPNG[chunkPos:chunkPos+4] | |
chunkLength = unpack(">L", chunkLength)[0] | |
chunkType = oldPNG[chunkPos+4 : chunkPos+8] | |
chunkData = oldPNG[chunkPos+8:chunkPos+8+chunkLength] | |
chunkCRC = oldPNG[chunkPos+chunkLength+8:chunkPos+chunkLength+12] | |
chunkCRC = unpack(">L", chunkCRC)[0] | |
chunkPos += chunkLength + 12 | |
# Parsing the header chunk | |
if chunkType == "IHDR": | |
width = unpack(">L", chunkData[0:4])[0] | |
height = unpack(">L", chunkData[4:8])[0] | |
# Parsing the image chunk | |
if chunkType == "IDAT": | |
try: | |
# Uncompressing the image chunk | |
bufSize = width * height * 4 + height | |
chunkData = decompress( chunkData, -8, bufSize) | |
except Exception, e: | |
# The PNG image is normalized | |
return None | |
# Swapping red & blue bytes for each pixel | |
newdata = "" | |
for y in xrange(height): | |
i = len(newdata) | |
newdata += chunkData[i] | |
for x in xrange(width): | |
i = len(newdata) | |
newdata += chunkData[i+2] | |
newdata += chunkData[i+1] | |
newdata += chunkData[i+0] | |
newdata += chunkData[i+3] | |
# Compressing the image chunk | |
chunkData = newdata | |
chunkData = compress( chunkData ) | |
chunkLength = len( chunkData ) | |
chunkCRC = crc32(chunkType) | |
chunkCRC = crc32(chunkData, chunkCRC) | |
chunkCRC = (chunkCRC + 0x100000000) % 0x100000000 | |
# Removing CgBI chunk | |
if chunkType != "CgBI": | |
newPNG += pack(">L", chunkLength) | |
newPNG += chunkType | |
if chunkLength > 0: | |
newPNG += chunkData | |
newPNG += pack(">L", chunkCRC) | |
# Stopping the PNG file parsing | |
if chunkType == "IEND": | |
break | |
return newPNG | |
def updatePNG(filename): | |
data = getNormalizedPNG(filename) | |
if data != None: | |
file = open(filename, "wb") | |
file.write(data) | |
file.close() | |
return True | |
return data | |
print "-----------------------------------" | |
print " iPhone PNG Images Normalizer v1.0" | |
print "-----------------------------------" | |
print " " | |
print "[+] Searching PNG files...", | |
pngs = glob("*.png") | |
print "ok" | |
if len(pngs) == 0: | |
print " " | |
print "[!] Alert: There are no PNG files found. Move this python file to the folder that contains the PNG files to normalize." | |
exit() | |
print " " | |
print " - %d PNG files were found at this folder (and subfolders)." % len(pngs) | |
print " " | |
while True: | |
normalize = raw_input("[?] Do you want to normalize all images (Y/N)? ").lower() | |
if len(normalize) > 0 and (normalize[0] == "y" or normalize[0] == "n"): | |
break | |
normalized = 0 | |
if normalize[0] == "y": | |
for ipng in xrange(len(pngs)): | |
perc = (float(ipng) / len(pngs)) * 100.0 | |
print "%.2f%% %s" % (perc, pngs[ipng]) | |
if updatePNG(pngs[ipng]): | |
normalized += 1 | |
print " " | |
print "[+] %d PNG files were normalized." % normalized |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment