为什么 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