问题描述
目标:比较两个 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);
}
比较两张相同的图片时,我得到的结果是一样的,但有点不透明。
感谢任何帮助。
编辑: 基本上我想结束的是这个。但不是结果有白色背景,我希望它是透明的。
解决方法
在命令行 ImageMagick 中,这将是如何做到这一点。抱歉,我不是 Magick.Net 用户。但是翻译应该是显而易见的。
汽车 1:
汽车 2:
"some thing"
,
我发现通过 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);
结果(除了黄色之外都是透明的):