用于转换和恢复从ipa文件中,提取到的png文件的Python脚本 支持Python 3.3版本

来源:互联网 发布:linux mysql 关闭 编辑:程序博客网 时间:2024/06/05 11:35

方法1,能适用于所有的png文件

# XCode 4.3+
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush

# XCode 4.2.x 以下版本
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

# 还原 ipa 目录下所以 png 文件到 reverted 目录下面
pngcrush -dir reverted -revert-iphone-optimizations -q ipa/*.png

 

 

方法2 ,该脚本只能转换小于3k的png文件

一个比较老的脚本,可以修复从ipa里面提取的png文件。原本只支持 Python 2.7, 修改为支持Python3.x版本

 

使用方法:拷贝该文件到png所在文件夹。运行即可。支持子文件夹遍历

 

# --# iPIN - iPhone PNG Images Normalizer v1.3# Modified by Jeffrey Ma# On 3/5/2013# Description: updates for Python ver 3.x#               raw_input be changed to input#               print "" be changed to print("")#               except Exception, e be changed to except Exception as e#---#---# iPIN - iPhone PNG Images Normalizer v1.3# 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# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.# #---from struct import *from zlib import *import statimport sysimport osdef 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 as 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 newPNGdef updatePNG(filename):    data = getNormalizedPNG(filename)    if data != None:        file = open(filename, "wb")        file.write(data)        file.close()        return True    return datadef getFiles(base):    global _dirs    global _pngs    if base == ".":        _dirs = []        _pngs = []            if base in _dirs:        return    files = os.listdir(base)    for file in files:        filepath = os.path.join(base, file)        try:            st = os.lstat(filepath)        except os.error:            continue                if stat.S_ISDIR(st.st_mode):            if not filepath in _dirs:                getFiles(filepath)                _dirs.append( filepath )                        elif file[-4:].lower() == ".png":            if not filepath in _pngs:                _pngs.append( filepath )                if base == ".":        return _dirs, _pngsprint ("-----------------------------------")print (" iPhone PNG Images Normalizer v1.3")print ("-----------------------------------")print (" ")dirs, pngs = getFiles(".")print ("[+] Searching PNG files...", dirs, pngs)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 = input("[?] Do you want to normalize all images (Y/N)? ").lower()    if len(normalize) > 0 and (normalize[0] == "y" or normalize[0] == "n"):        breaknormalized = 0if 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 += 1print (" ")print ("[+] %d PNG files were normalized." % normalized)


 

原创粉丝点击