写了一个修复ipa png图片的Library
发布于 8 年前 作者 forsigner 4492 次浏览 来自 分享

最近做项目遇到一个需求:解析apk和ipa包,然后把里面的icon上传到服务器。

问题

解析上传过程比较简单,我使用JSZip对apk和ipa进行解压,然后把找到里面的icon上传到服务器。但是,当我在网页中使用图片时,问题出现了。对于apk中的icon,没有任何问题,但是对于ipa中解析出来的图片,在safari中可以正常显示,在其他任何浏览器去无法显示。

原因

Google后发现,是苹果对png图片进行了优化处理,具体看这篇文章(查看),在文章中我们可以了解到一些有用信息:

Apple uses PNGCursh open source library to crush png images inside iPA files。

解决方案

作为一个前端工程师,我希望用javascript解决这个问题。其实之前国外已经有人去解决了,NodeJS-PNGDefry就是可以,可惜这个太久没维护,已经跑不起来。

找不到可用的,我只能自己动手丰衣足食,自己写一个。因此有了node-pngdefrynode-pngdefry的功能很明确,就是用Javascript来还原被苹果处理过的png图片。

node-pngdefry用法很简单,支持命令行和常规的Node.js:

命令行用法

install:

$ npm install -g pngdefry

** then run:**

$ pngdefry -i icon.png -o icon.new.png

在Node.js中使用

$ npm install pngdefry --save-dev
var pngdefry = require('pngdefry');
var path = require('path');

var input = path.join(__dirname, 'icon.png');
var output = path.join(__dirname, 'icon.new.png');

pngdefry(input, output, function(err) {
  if (err) {
    return;
  }

  console.log('success');
});

Test

$ npm test

项目地址

node-pngdefry

感谢

最后感谢上面提到的文章的作者Jongware。

8 回复

try node native addon, child_process 在服务端还是不能大量使用 https://github.com/forsigner/node-pngdefry/blob/master/lib%2Findex.js#L56

@magicdawn 请问为什么?

@magicdawn 我觉得要具体问题具体分析, node-pngdefry的子进程是用后瞬间就Exit,所以不用考虑这个问题。如果子进程是持续不会退出的,就要考虑进程数限制的问题了。

@magicdawn 对像PHP这种为每一位用户都开启一个进程的机制怎么看?

@forsigner

要是真有1K用户同时访问了~哈哈

@forsigner 怎么看…我不想看…

回到顶部