`

把ipa中压缩过的png转换成正常PNG的Python脚本

 
阅读更多

苹果应用安装程序,其实质是一个压缩文件,里面包含应用所需的图片资源,但被压缩过,无法直接拿来使用,需要在MacOSX 中调用pngcrush工具把图片转换成正常的图像才行。在Windows系统上,在sf上有个开源工具号称可以转换,但没搞明白如何使用,放弃了。今天从国外网站找了个Python脚本,还没试,等需要的时候再试。

#---
# 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

 

分享到:
评论

相关推荐

    Java提取IPA中的png文件, 并进行解码还原png图片

    这次我们要探讨的是如何在Java环境中处理iOS应用(IPA)中的PNG图像文件,并将其解码以便在Windows或其他非iOS平台上正常显示。首先,让我们理解一下问题的背景。 PNG(Portable Network Graphics)是一种无损压缩...

    使用python脚本轻松定制自动化iOS项目打包IPA并上传到appstore.zip

    使用python脚本轻松定制自动化iOS项目打包IPA并上传到appstore.zip 主要功能 打包项目(.xcodeproj, .xcworkspace), 生成.xcarchive 生成.ipa 导出.DSYM 上传ipa到appstore

    Java提取IPA中的png文件 源码

    总之,Java通过`java.util.zip`库提供了解压缩文件的强大功能,使得我们能够方便地从IPA文件中提取PNG图像。理解这一过程有助于在开发过程中处理各种资源文件,特别是在跨平台的移动应用开发中。

    解决ipa导出的png无法在windows 下查看的工具

    在苹果iPHone中提取的PNG文件无法在Windows系统上正常查看,这是因为PNG经过加密处理了,在网上找到一款工具可以把PNG转换成正常的PNG,您可以试试。 参考下载: http://dl.vmall.com/c0r0vlm07m# ...

    IPA图片还原工具源代码

    4. ipin.py:这是源代码文件的名字,通常是一个Python脚本,用于实现从IPA文件中提取PNG图片的功能。Python是一种广泛使用的编程语言,因其简洁的语法和丰富的库支持而适合进行这样的任务。它可能包含了读取ZIP文件...

    nodejs修复ipa处理过的png图片.docx

    标题中的“nodejs修复ipa处理过的png图片”指的是在iOS应用开发过程中,Apple为了优化IPA(iOS应用程序包)文件的大小,会使用PNGCrush工具对PNG图像进行压缩,这可能导致图片数据出现损坏或丢失透明度等问题。...

    ipa转换工具(转换成ipa格式来安装软件)

    本文将详细解析“ipa转换工具”及其在安装软件过程中的作用。 首先,我们要理解什么是IPA文件。IPA是iPhone Application的缩写,它是苹果iOS设备上应用程序的二进制格式。这种格式包含了应用程序的代码、资源文件...

    Python-快速上传ipa在线安装

    【Python-快速上传ipa在线安装】是一个针对iOS应用开发者的重要话题,主要涉及到使用Python脚本自动化处理IPA(iOS应用程序)的上传与在线安装过程。在iOS应用开发中,IPA是应用的二进制文件格式,通常用于通过Apple...

    ios打包Python脚本

    这篇内容将详细介绍如何使用Python脚本来实现iOS应用的打包,以及这一过程中涉及的关键知识点。 首先,理解iOS应用的打包过程至关重要。iOS应用的打包主要包括编译源代码、资源文件整合、签名验证和生成IPA文件等...

    pxl2ipa脚本

    pxl2ipa脚本是一种工具,主要用于将iOS的.pxl格式的应用程序转换为.ipa格式。在iOS设备上,我们通常下载的是.ipa文件,这是一种包含应用程序二进制代码、资源和其他必要文件的封装格式。然而,有些情况下,开发者...

    ipa图片转换工具

    "ipa图片转换工具"就是专为解决特定问题而设计的软件,它能够将那些在苹果系统中无法正常打开的PNG图片转换为可识别的PNG格式。这主要涉及到iOS应用开发中的资源处理,因为IPA是iOS应用程序的打包格式,其中可能包含...

    Python-打包机器人打包改签名上传发邮件打印ipa信息

    在这个项目中,Python被用来编写自动化脚本,处理打包、签名、上传等任务。 2. **打包(Packaging)**:在软件开发中,打包是将源代码、资源文件和配置文件整合成一个可执行文件或安装包的过程。Python的`...

    swift-PythoniOS自动打包脚本(包含上传到fir)

    Swift和Python在iOS开发中的结合使用,特别是在自动化打包和分发流程中,可以极大地提高工作效率。这个名为"swift-PythoniOS自动打包脚本(包含上传到fir)"的项目,是针对iOS开发者设计的一个自动化工具,它利用...

    IPA转apk超级工具

    - 转换过程中可能需要对原始IPA应用进行逆向工程,这可能涉及到版权和合法性问题。因此,使用这样的工具应确保遵循法律法规,尊重开发者权益。 - 转换后的APK可能无法实现与原版iOS应用完全相同的功能,因为两者...

    ipa批量打包shell脚本

    在压缩包"ipa批量打包shell脚本"中,可能包含了示例脚本和其他辅助文件,如`exportOptions.plist`模板,你可以根据自己的需求修改这些文件以适应你的项目。记得在使用前检查脚本的安全性,防止引入潜在的安全风险。 ...

    Python-从越狱设备拉解密的ipa

    在IT行业中,Python是一种强大的编程语言,特别是在安全领域,它被广泛用于各种任务,包括对移动应用的逆向工程和分析。在这个场景中,我们关注的是如何从越狱的iOS设备上提取并解密ipa文件。"Python-从越狱设备拉...

    python读取Android apk 包名,权限,以及读取 ios IPA bid,权限. 上传文件,将权限写入excel 表格

    python读取Android apk 包名,权限,以及读取 ios IPA bid,权限. 上传文件,将权限写入excel 表格,有能力的大佬可以再优化,做成反编译工具,或者我自己有时间了再自己优化添加一些功能。

    python-freeipa:python-freeipa是轻量级的FreeIPA客户端

    python-freeipa是轻量级的FreeIPA客户端。 API文档: :

    Mac 环境初始化 Python 写的自动打包ipa的系统 (超实用).zip

    在Mac环境下,使用Python自动化打包IPA(iOS应用)是一项高效且实用的技术,尤其对于开发者来说,可以大大提高工作效率。本文将详细介绍如何在Mac OS上搭建这样的系统,并探讨其中涉及的关键知识点。 首先,我们要...

Global site tag (gtag.js) - Google Analytics