還原iOS的安裝包ipa裡的png圖片為正常圖片

來源:互聯網
上載者:User

參考地址:http://www.axelbrz.com.ar/?mod=iphone-png-images-normalizer

牛人寫了一個python指令碼恢複iOS程式中的png圖片。

指令碼:ipin.py

使用方法:

1、把ipin.py放到要恢複的.png圖片一個目錄裡

2、開啟終端,cd到此目錄。

3、輸入 python ipin.py  

4、根據提示資訊輸入 Y,斷行符號。這樣就能把圖片還原到可以查看了。

#---# 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# 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, 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.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."    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"):        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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.