0

目标:比较两个 PNG 图像并创建一个仅包含更改的新图像(未以红色或任何内容突出显示),而 png 的其余部分是透明的。

            MagickImage newImg = new MagickImage(image2Path);

            MagickImage oldImage = new MagickImage(diffImagePath);

            oldImage.Compose = CompositeOperator.Difference;

            var diffimage = new MagickImage();

            using (var imgDiff = new MagickImage())
            {
                double diffd = newImg.Compare(oldImage, ErrorMetric.Absolute, diffimage);
            }

当比较两张相同的图片时,我最终得到的结果是相同的,但有点不透明。

任何帮助表示赞赏。

编辑:基本上我想结束的是这个。但是,我希望它是透明的,而不是具有白色背景的结果。 在此处输入图像描述

4

2 回答 2

0

在命令行 ImageMagick 中,这就是如何做到这一点的。抱歉,我不是 Magick.Net 用户。但翻译应该是显而易见的。

车1:

在此处输入图像描述

车2:

在此处输入图像描述

compare -highlight-color red -lowlight-color none -compose src car1.png car2.png diff.png

在此处输入图像描述

于 2021-02-16T19:36:27.740 回答
0

我发现通过 API 使用 Magick.Net 和 ImageMagick 通常很烦人,因为所有文档都描述了命令行,所以你不得不猜测如何转换为 API 调用。

这是我设法蹒跚而行的一种方法。也许有更优雅的方式。

输入:

有文字的车 不写字的车

var newImg = new MagickImage(pathToCarWithWriting);
var oldImg = new MagickImage(pathToBlankCar);

// Calcluate a greyscale mask for any changed pixels.
// The mask should not have an alpha channel so it can work with Copy_Opacity
// The 'treshold' value of 60% is stolen from 
// https://stackoverflow.com/questions/38060940/how-to-create-black-and-white-images-in-magick-net
var diffMask = newImg.Clone();
diffMask.Composite(oldImg, CompositeOperator.Difference, Channels.RGB);
// Convert to greyscale
diffMask.Threshold(new Percentage(60));


var changed = newImg.Clone();
// Overlay a greyscale mask to the new image, using CopyAlpha
// (which does not copy the alpha channel when the overlay has no alpha channel, but instead treats it as a mask)
// Now only the areas that are different in newImg and oldImg will be visible in Changed.
changed.Composite(diffMask, CompositeOperator.CopyAlpha);

结果(除了黄色是透明的):

在此处输入图像描述

于 2021-02-16T22:18:50.857 回答