- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 HTML5 应用。
当用户从他们的手机上传图片时,尺寸太大。
我想像 pngcrush 方式一样将图像压缩为 PNG。
前端有没有什么好的选择方式(比如javascript库)?
或者是否可以将 pngcrush 库移植到 javascript?
最佳答案
有一些项目似乎是基于使用 emscripten 的想法。 (一个 LLVM 到 JavaScript 的编译器)实际编译来自 pngcrush 的源代码为浏览器运行 JavaScript。
pngcrush-1.7.27 版本是目前唯一一个似乎不会为我生成损坏图像的版本。我在这里整理了一个使用 promise 的示例:http://plnkr.co/edit/iLpbOjlYiacR04oGdXSI?p=preview
这是一个基本的用法示例:
var instance = new pngcrush();
instance.exec(inputFile, function (stdoutEvent) {
console.log(stdoutEvent.data.line);
}).then(function (doneEvent) {
var outputFile = new Blob([doneEvent.data.data], { type: 'image/png' });
// do something with the outputFile
});
以下是上述plunker的pngcrush-class.js
文件内容,供引用:
(function(exports) {
var noop = function () {};
function pngcrush () {
this.callbacks = {
'error': [],
'done': [],
'start': [],
'stdout': []
};
}
pngcrush.prototype.exec = function (file, notify) {
var self = this;
if (this.execPromise) {
return this.execPromise.catch(noop).then(function () {
return self.exec(file, notify);
});
}
if (file.type !== 'image/png') {
return Promise.reject(file);
}
var promise = this.execPromise = this.readAsArrayBuffer(file).then(function (event) {
var arrayBuffer = event.target.result;
return self.initWorker().then(function (worker) {
var done = new Promise(function (resolve, reject) {
var offDone, offError, offStdout;
offDone = self.once('done', function (event) {
offError();
offStdout();
resolve(event);
});
offError = self.once('error', function (event) {
offDone();
offStdout();
reject(event);
});
offStdout = self.on('stdout', function (event) {
if (typeof notify === 'function') {
notify.call(self, event);
}
});
worker.postMessage({
'type': 'file',
'data': new Uint8Array(arrayBuffer)
});
worker.postMessage({
'type': 'command',
'command': 'go'
});
});
done.catch(noop).then(function () {
worker.terminate();
});
return done;
});
});
promise.catch(noop).then(function () {
if (promise === self.execPromise) {
delete self.execPromise;
}
});
return promise;
};
pngcrush.prototype.initWorker = function () {
var self = this;
if (this.workerPromise) {
return this.workerPromise;
}
var promise = this.workerPromise = new Promise(function (resolve, reject) {
var worker = new Worker('worker.js');
worker.onerror = function (event) {
var callbacks = [];
reject(event);
Array.prototype.push.apply(callbacks, self.callbacks.error);
while (callbacks.length) {
callbacks.shift().call(self, event);
}
};
worker.onmessage = function (event) {
if (event.data.type === 'ready') {
worker.onmessage = function (event) {
var name = event.data.type;
if (typeof self.callbacks[name] !== 'undefined') {
var callbacks = [];
Array.prototype.push.apply(callbacks, self.callbacks[name]);
while (callbacks.length) {
callbacks.shift().call(self, event);
}
}
};
resolve(worker);
}
};
});
promise.catch(noop).then(function () {
if (promise === self.workerPromise) {
delete self.workerPromise;
}
});
return promise;
};
pngcrush.prototype.on = function (name, callback) {
var self = this;
if (typeof this.callbacks[name] !== 'undefined' && typeof callback === 'function') {
this.callbacks[name].push(callback);
var off = (function () {
var ran = false;
return function () {
if (ran === true) {
return;
}
ran = true;
var idx = self.callbacks[name].lastIndexOf(callback);
if (idx !== -1) {
self.callbacks[name].splice(idx - 1, 1);
}
};
})();
return off;
}
return noop;
};
pngcrush.prototype.once = function (name, callback) {
var off = this.on(name, function () {
off();
callback.apply(this, arguments);
});
return off;
};
pngcrush.prototype.readAsArrayBuffer = function (file) {
var fileReader = new FileReader();
return new Promise(function (resolve, reject) {
fileReader.onerror = reject;
fileReader.onload = resolve;
fileReader.readAsArrayBuffer(file);
});
};
pngcrush.prototype.readAsDataURL = function (file) {
var fileReader = new FileReader();
return new Promise(function (resolve, reject) {
fileReader.onerror = reject;
fileReader.onload = resolve;
fileReader.readAsDataURL(file);
});
};
exports.pngcrush = pngcrush;
})(this);
关于javascript - 客户端 PNG 压缩使用像 pngcrush 这样的 javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751867/
我正在尝试使用 pngcrush 来优化我的 png 图像。我可以使用以下命令在终端上运行它 $ pngcrush -brute -e "Optimize.png"文件名.png 但我想通过我的 Ja
我有一堆数百张图片,我想使用 pngcrush 来减小文件大小。 我知道如何用终端粉碎一个文件,但在网络上我找到了假设先前知识的部分解释。 有人可以解释一下如何清楚地做到这一点。 谢谢 沙尼 最佳答案
我似乎在复制 xcode 进行的 iOS png 优化时遇到了问题。我们的应用程序允许用户通过 Assets 服务器更新内容,方法是将 bundle 中存储的文件的校验和与服务器上的校验和进行比较。在
我希望完成我在 xcode5 中创建的应用程序。当我用模拟器运行它时,一切顺利,没有错误,但是当我尝试存档应用程序时,我在项目中的图像方面遇到了无数错误。许多都标有文本“pngcrush 捕获了 li
这个问题在这里已经有了答案: 已关闭11 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
pngcrush 在减小 PNG 文件大小方面做得非常好。我想知道 GIF 是否有类似的情况,我们仍在应用程序中使用它(无法快速修复)。 Google Page Speed 声称我们的 GIF 图像可
我对“pngcrush”工具几乎没有疑问。 在 xcode 构建过程中, 我将“压缩 PNG 文件”选项设置为"is",然后检查二进制文件和图像大小。 然后在我的另一个构建过程中,我将选项“压缩 PN
我的 iPhone 应用程序项目中有一些 png 文件。当我为模拟器构建时它们工作得很好。但是当我为设备构建时,突然每个 png 文件都会生成可怕的“在读取 such-and-such.png png
这是 Xcode 中的错误消息:在 /Path/image@2x.png pngcrush 中检查 alpha 时捕获了 libpng 错误:图像不足 dCommand/Applications/Xc
我知道 Pngcrush 是 iOS 中的一种图像优化技术,但我怀疑 X-code 是否会在每次构建期间或在将我们的应用程序部署到 iTunes 商店之前在内部执行此操作,我们是否需要进行此图像优化?
有一个 Apple 定制版本的 pngcrush在 4.3 之前的每个 Xcode 版本中。我在 Xcode 4.3 中找不到它。是否仍可作为独立使用 exe文件? 另一个相关问题:来自 Comman
我正在开发 HTML5 应用。 当用户从他们的手机上传图片时,尺寸太大。 我想像 pngcrush 方式一样将图像压缩为 PNG。 前端有没有什么好的选择方式(比如javascript库)? 或者是否
我有一个包含许多图像文件的目录树,然后我必须移动到另一个目录树。但是在这个命运目录中,我的 png 文件必须被压缩。 例如: 源目录树: ./model/layout/img ./model/layo
在 ruby 中,我想得到与下面的代码相同的结果,但不使用 curl: curl_output = `curl -X POST -s --form "input=@#{png_image_file
问题几乎就是标题中的问题。 我有很多 MapTiler 创建的 PNG 文件。确切地说是 24083 个文件。它们位于许多文件夹中,这些文件夹位于许多文件夹中,即文件夹树,duh。问题是,手动 PNG
我有一些从 IPA 文件中提取的 png 图像,我想找回原始的 PNG,有人告诉我 pngcush完成了所需的任务,所以我下载了它并尝试运行以下命令: pngcrush -fix icon.png i
iOS 使用一种名为 pngcrush 的工具对 PNG 进行处理。如果我想优化 Linux 服务器上的图像,我该怎么做? 最佳答案 忽略它,iOS 特定的更改 don't improve perfo
我使用 Mac OS 10.7.5 和 XCode 4.6.2 开发了一个应用程序。应用程序在我的机器上运行良好,没有任何错误/警告。 但是当我尝试在另一台机器上运行 Mac OS 10.8 和 XC
我是一名优秀的程序员,十分优秀!