在 Magick.Net 中重现 GDI+ 的合成质量

问题描述

我正在尝试替换使用 GDI+ 向图像添加水印的函数。具有使用 magick.net 的等效函数

GDI+功能如下:

public void DrawImage(Image image,Rectangle sourceRect,Rectangle destRect,double opacity,bool highQuality)
{
    using (var g = Graphics.FromImage(Control))
    {
        using (var imgAttr = new ImageAttributes())
        {
             if (opacity != 1.0)
             {
                 var matrix = new float[][] {
                              new float[] { 1,0},new float[] { 0,1,(float)opacity,0}
                 };
                 imgAttr.SetColorMatrix(new ColorMatrix(matrix));
             }
             imgAttr.SetWrapMode(WrapMode.TileFlipXY);

             g.CompositingMode = CompositingMode.sourceOver;
             g.CompositingQuality = highQuality ? CompositingQuality.HighQuality : CompositingQuality.Default;
             g.PixelOffsetMode = highQuality ? PixelOffsetMode.HighQuality : PixelOffsetMode.None;
             g.SmoothingMode = highQuality ? SmoothingMode.HighQuality : SmoothingMode.None;
             g.InterpolationMode = highQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Bilinear;

             g.DrawImage(image,destRect,sourceRect.X,sourceRect.Y,sourceRect.Width,sourceRect.Height,GraphicsUnit.Pixel,imgAttr);
        }
    }
}

到目前为止使用 magick.net 我有这样的功能

public void DrawImage(MagickImage image,MagickGeometry sourceRect,MagickGeometry destRect,bool highQuality = false)
{
    var source = image.Clone(sourceRect.X,sourceRect.Height);
    destRect.IgnoreAspectRatio = true;
    source.Resize(destRect);
    source.Alpha(AlphaOption.Set);
    source.Evaluate(Channels.Alpha,EvaluateOperator.Multiply,opacity);
    _magick.Composite(source,destRect.X,destRect.Y,CompositeOperator.SrcOver);
}

当 highQuality 标志为 false 时,这两种方法会产生相同的结果。然而,当标志为真时,GDI+ 会产生一个更加不透明的水印。

有谁知道如何在 ImageMagick 中重现 CompositingQuality.HighQuality 效果

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)