为什么 GraphicsMagick 1:1 与不透明和填充的颜色交换不起作用?
Why GraphicsMagick 1:1 color exchange with opaque & fill not work?
我尝试用 node + GraphicsMagick 交换我的 png 中的一种颜色。
我的代码:
const gm = require('gm');
gm('./in.png').fill('black').opaque('#ccffff').write('./out.png', (err) => {
console.log("recolored file saved");
});
这个脚本不仅改变了图像的颜色,还改变了图像的内容!
如何只改变颜色?
in.png
out.png
这种颜色交换1:1你不能在gm(或imagemagick)中做还有另一个概念(详情:https://legacy.imagemagick.org/Usage/color_basics/#replace)
但是你可以逐像素转换:
var fs = require('fs'),
PNG = require('pngjs').PNG;
console.log("run convert ...")
fs.createReadStream('./in.png')
.pipe(new PNG())
.on('parsed', function() {
for (var y = 0; y < this.height; y++) {
for (var x = 0; x < this.width; x++) {
var idx = (this.width * y + x) << 2;
// exchange color
if(this.data[idx] == 204 && this.data[idx+1] == 255 && this.data[idx+2] == 255){
this.data[idx] = 255; // R
this.data[idx+1] = 0; // G
this.data[idx+2] = 0; // B
}
}
}
this.pack().pipe(fs.createWriteStream('out.png'));
});
请注意,我确实理解了这个问题,但是如果您使用 ImageMagick 执行以下操作,您将得到我期望的结果:
magick image.png -fill magenta -opaque "rgb(204,255,255)" result.png
我尝试用 node + GraphicsMagick 交换我的 png 中的一种颜色。
我的代码:
const gm = require('gm');
gm('./in.png').fill('black').opaque('#ccffff').write('./out.png', (err) => {
console.log("recolored file saved");
});
这个脚本不仅改变了图像的颜色,还改变了图像的内容!
如何只改变颜色?
这种颜色交换1:1你不能在gm(或imagemagick)中做还有另一个概念(详情:https://legacy.imagemagick.org/Usage/color_basics/#replace)
但是你可以逐像素转换:
var fs = require('fs'),
PNG = require('pngjs').PNG;
console.log("run convert ...")
fs.createReadStream('./in.png')
.pipe(new PNG())
.on('parsed', function() {
for (var y = 0; y < this.height; y++) {
for (var x = 0; x < this.width; x++) {
var idx = (this.width * y + x) << 2;
// exchange color
if(this.data[idx] == 204 && this.data[idx+1] == 255 && this.data[idx+2] == 255){
this.data[idx] = 255; // R
this.data[idx+1] = 0; // G
this.data[idx+2] = 0; // B
}
}
}
this.pack().pipe(fs.createWriteStream('out.png'));
});
请注意,我确实理解了这个问题,但是如果您使用 ImageMagick 执行以下操作,您将得到我期望的结果:
magick image.png -fill magenta -opaque "rgb(204,255,255)" result.png