zoukankan      html  css  js  c++  java
  • iOS app中资源文件的获取方式

    在编译打包到app的过程中,原有的png都被在最后加上了特定都数据段,这样从app里直接取出来图片既不能看,也不能用,所以需要工具来进行还原

    链接http://www.axelbrz.com.ar/?mod=iphone-png-images-normalizer

    #---
    # 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 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
    
    def 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, _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."
        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
    

    操作命令,都在命令行中

    解压后的app目录, 将python脚本命名为ipin.py
    将该python文件放在你要执行normalize的文件夹下面

    自己创建一个文件夹normal,然后把解压app获得的所有文件放入在改目录下。

    在命令行中进入到该文件夹之下,执行命令

    $python ipin.py 执行之后会显示相应的结果。


  • 相关阅读:
    409. Longest Palindrome(计算一组字符集合可以组成的回文字符串的最大长度)
    242. Valid Anagram(两个字符串包含的字符是否完全相同)
    17. Letter Combinations of a Phone Number(电话号码的字母组合)
    模块XML真垃圾
    数据库是什么
    python项目开发规范
    面向对象之类的成员
    面向对象
    模块之 import os 模块一
    模块之序列化 import json
  • 原文地址:https://www.cnblogs.com/easonoutlook/p/2823186.html
Copyright © 2011-2022 走看看