iPhone PNG Images Normalizer

Información general

iPhone PNG Images Normalizer es un software hecho en python que te permitirá normalizar las imágenes PNG que haz descargado desde tu iPhone o iPod touch. Una vez normalizadas las imágenes podrás visualizarlas y editarlas como cualquier otro archivo PNG.

# iPIN - iPhone PNG Images Normalizer v1.0
# Copyright (C) 2007
# Author:
#  Axel E. Brzostowski
#  http://www.axelbrz.com.ar/
#  axelbrz@gmail.com
# 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
# GNU General Public License for more details.

from struct import *
from zlib import *
import stat
import sys
import os

def getNormalizedPNG(filename):
    pngheader = "\x89PNG\r\n\x1a\n"
    file = open(filename, "rb")
    oldPNG = file.read()

    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":
                # 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":
    return newPNG

def updatePNG(filename):
    data = getNormalizedPNG(filename)
    if data != None:
        file = open(filename, "wb")
        return True
    return data

def getFiles(base):
    global _dirs
    global _pngs
    if base == ".":
        _dirs = []
        _pngs = []
    if base in _dirs:

    files = os.listdir(base)
    for  file in files:
        filepath = os.path.join(base, file)
            st = os.lstat(filepath)
        except os.error:
        if stat.S_ISDIR(st.st_mode):
            if not filepath in _dirs:
                _dirs.append( filepath )
        elif file[-4:].lower() == ".png":
            if not filepath in _pngs:
                _pngs.append( filepath )
    if base == ".":
        return _dirs, _pngs

print "-----------------------------------"
print " iPhone PNG Images Normalizer v1.0"
print "-----------------------------------"
print " "
print "[+] Searching PNG files...",
dirs, pngs = getFiles(".")
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."
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"):

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


» Download iPhone PNG Images Normalizer v1.0

Comments (17 comments)

nofxx wrote: 2009-03-10 18:22:52
Works as a charm! Thank you!
rriphone wrote: 2009-03-15 18:50:26
This is great. I used another tool called iphone_png which left the image colors inverted. This one works wonderfully. Thank you
Harry Harrison wrote: 2009-04-10 17:07:13
Damn, i wish i knew how i could use this.

I've been using your online normalizer for a a while, but it doesn't seem to be working at the moment. Just letting you know.

Axel E. Brzostowski wrote: 2009-04-13 03:49:12
Harry Harrison,

Thanks, but that page isn't mine.

To use this code you have to:

1) Install python at your computer

2) Save ipin.py file in the folder where you have all PNG images to modify (warning: images will be replaced!)

3) Run the program using 'python ipin.py' command (without quotes), or maybe you will be able to run it just double clicking on file.

I hope it was helpful to you!

Good luck!

Pedro wrote: 2009-04-25 14:43:04
How to do the invers way?
Grant wrote: 2009-05-08 14:22:06
This seems like the only script that will work on my Mac but theres one major problem when i run the script it searches my whole hard drive not just the folder i put ipin.py in, and i beleive i've heard that if its used on a already viewable png then those files would be permanently corrupted so i dot know what to do.
Michael wrote: 2009-05-08 19:00:16
it doesnt work for me, how do i run the script?
Pharma798 wrote: 2009-07-03 22:26:15
Very nice site!
Pharmg206 wrote: 2009-07-04 14:17:05
Very nice site!
Pharmd981 wrote: 2009-07-04 16:04:51
Very nice site!
Pharmc15 wrote: 2009-07-08 23:50:40
Very nice site!
Phil wrote: 2009-07-14 02:10:06
Your online converter produces an error :(
Axel E. Brzostowski wrote: 2009-07-17 15:17:08
Hi Phil, I don't have an online converter. Any web page outside this server isn't mine.
Pharmd846 wrote: 2009-07-28 11:41:52
Very nice site!
erik wrote: 2009-07-28 19:37:39
i can't get it to work on windows... followed the instructions and ran it in the folder with the png files, but when i try to edit them i still can't display them properly
vishy wrote: 2009-08-15 16:33:11
sad spam, but how to mod your amazing python script to not convert all png on hard drive, I\'ve tried putting it in different folders, I read the code but don\'t know what to alter, if possible, thanks still
Axel E. Brzostowski wrote: 2012-09-17 17:19:48
Thanks to Uriel Katz for this contribution:


(It handles files with more than one IDAT chunk. Icon-72.png has that problem)
Post your comment
(It will not be shown / No será mostrado)