我正在创建一个用户可以上传图片的代码。图像通过GraphicsMagick转换并上传到我们的云端。但最好是将非透明图像转换为JPG而不是PNG以获得透明图像。如何在GraphicsMagick中检查图像是否包含alpha通道?
答案 0 :(得分:1)
我不确定您是否可以仅使用GraphicsMagick实现这一目标,但可以通过其他几种方式实现。例如pngjs:
您可以查看PNG元数据:
const gm = require('gm');
const PNG = require('pngjs').PNG;
gm('/path/to/image')
.stream('png')
.pipe(new PNG({}))
.on('metadata', meta => {
if (meta.alpha) {
// image is transparent
} else {
// image is not transparent
}
});
或迭代像素并确定它的透明度对您有价值,或者您可以省略它:
...
.on('parsed', function() {
let isAlphaValuable = false;
for (var y = 0; y < this.height; y++) {
for (var x = 0; x < this.width; x++) {
var idx = (this.width * y + x) << 2;
// this.data[idx] - red channel
// this.data[idx + 1] - green channel
// this.data[idx + 2] - blue channel
// this.data[idx + 3] - alpha channel
// if there is at least one pixel
// which transparent for more than 30%
// then transparency valuable to us
isAlphaValuable |= (1 - this.data[idx + 3] / 255) > 0.3;
}
}
if (isAlphaValuable) {
// keep transparency
} else {
// ignore transparency
}
});
答案 1 :(得分:0)
您也可以尝试imagemagick
Snippet在TypeScript中,并使用BPromise.promisify以提高可读性。
请注意,这适用于PNG,JPEG的预期方式(返回字符串true / false),但对于GIF,它会为您提供连接的&#39; |&#39; false&#39; string(例如&#39; truetruefalse&#39;,并按帧应用alpha检查)。
我还建议将.trim()应用于结果,以消除imagemagick v0.x返回的潜在无用空格。时不时地。
import * as imagemagick from 'imagemagick';
import * as BPromise from 'bluebird';
...
const opaqueAsync: any = BPromise.promisify(imagemagick.identify, {context: imagemagick});
const isOpaqueReturnValue: string = await opaqueAsync(['-format', '%[opaque]', picturePath]);
const isPicTransparent: boolean = 'false' === isOpaqueReturnValue.trim();