将 .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。我希望这对未来的读者有所帮助。
从 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。我希望这对未来的读者有所帮助。