目标:比较两个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);
}当我比较两张相同的图片时,我得到的结果是相同的,但有一点不透明。
任何帮助都是非常感谢的。
编辑:基本上我想要结束的是这样的。但我希望结果是透明的,而不是白色背景。

发布于 2021-02-17 03:36:28
在命令行ImageMagick中,这就是如何做到这一点。对不起,我不是Magick.Net用户。但是翻译应该是显而易见的。
Car1:

Car2:

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

发布于 2021-02-17 06:18:51
一般来说,我发现通过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);结果(除黄色外都是透明的):

https://stackoverflow.com/questions/66223931
复制相似问题