将 .Net Bitmap() 转换为 MagickImage

Convert .Net Bitmap() to MagickImage

从 ImageMagick 7.17 升级到 7.22.2.1 NuGet 导致 MagickImage 的构造函数出现以下错误。我无法确定替换方法。帮我找到文档。谢谢,

参数 1:无法从 'System.Drawing.Bitmap' 转换为 'byte[]'

代码:

var bitmap = new Bitmap(somesource);
var m = new MagickImage(bitmap);

位图 reader 已移至 Magic.NET.SystemDrawing。

var m = new MagickFactory();
MagickImage image = new MagickImage(m.Image.Create(objImage));

我才刚刚开始玩这个,所以这可能不是很好的代码,但到目前为止它对我有用。

public static Bitmap ToBitmap(this IMagickImage mimg, MagickFormat fmt = MagickFormat.Png24)
{
    Bitmap bmp = null;
    using (MemoryStream ms = new MemoryStream())
    {
        mimg.Write(ms, fmt);
        ms.Position = 0;
        bmp = (Bitmap)Bitmap.FromStream(ms);
    }
    return bmp;
}
public static IMagickImage ToMagickImage(this Bitmap bmp)
{
    IMagickImage img = null;
    MagickFactory f = new MagickFactory();
    using (MemoryStream ms = new MemoryStream())
    {
        bmp.Save(ms, ImageFormat.Bmp);
        ms.Position = 0;
        img = new MagickImage(f.Image.Create(ms));
    }
    return img;
}

某些 ImageMagick 操作在写入流时似乎需要不同的格式,因此您可能需要使用 fmt 参数。

我最终使用了两个答案来将我的位图与 MagickImageCollection() 一起使用。

using var collection = new MagickImageCollection();

for(var frame = 0; frame < _animation.Length; frame++) {
    Bitmap        bitmap        = _animation[frame];
    Bitmap        canvas        = new Bitmap(bitmap.Width, bitmap.Height);
    MagickFactory magickFactory = new MagickFactory();

    using MemoryStream memoryStream = new MemoryStream();
    using Graphics     graphics     = Graphics.FromImage(canvas);

    graphics.FillRectangle(Brushes.Transparent, 0, 0, bitmap.Width, bitmap.Height);
    graphics.DrawImage(bitmap, new Point(0, 0));

    canvas.Save(memoryStream, ImageFormat.Png);
    canvas.Dispose();

    collection.Add(new MagickImage(magickFactory.Image.Create((Bitmap)Image.FromStream(memoryStream))));
    collection[frame].AnimationDelay = 100;

    memoryStream.Close();
}

collection.Quantize(new QuantizeSettings { Colors = 256 });
collection.Write(dialog.FileName);
collection.Dispose();

请注意,我在此项目中使用的是 Magick.NET.SystemDrawing v4.0.19 and Magick.NET-Q16-AnyCPU v11.0.0。我希望这对未来的读者有所帮助。