如何将System.Windows.Media.DrawingImage转成Stream?
How to convert System.Windows.Media.DrawingImage into Stream?
我正在尝试将 DrawingImage 转换为 MemoryStream。我的代码如下所示:
public MemoryStream ImageStream(DrawingImage drawingImage)
{
MemoryStream stream = new MemoryStream();
ImageSource imageSource = drawingImage;
if (imageSource != null)
{
BitmapSource bitmap = imageSource as BitmapSource;
if (bitmap != null)
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(stream);
}
}
return stream;
}
但问题是在将 ImageSource 转换为 BitmapSource 位图后始终为空。任何关于如何解决这个问题的建议?
您的 bitmap
变量始终为 null 的原因是因为 DrawingImage
没有扩展 BitmapImage
或 vice-versa,因此强制转换肯定会失败。 DrawingImage
不包含任何类型的任何像素数据。它引用了一个 Drawing
,每当图像需要光栅化时都会使用它。
您是如何发现自己想要光栅化 DrawingImage
并将其序列化为流的?如果您需要这样的功能,我觉得您正在以一种不寻常的方式做某事。
不过,您可以通过将 DrawingImage
绘制到 DrawingVisual
,将其渲染到 RenderTargetBitmap
,然后将渲染目标传递给编码器以序列化来实现此功能栅格数据到流。
public MemoryStream ImageStream(DrawingImage drawingImage)
{
DrawingVisual visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawDrawing(drawingImage.Drawing);
dc.Close();
}
RenderTargetBitmap target = new RenderTargetBitmap((int)visual.Drawing.Bounds.Right, (int)visual.Drawing.Bounds.Bottom, 96.0, 96.0, PixelFormats.Pbgra32);
target.Render(visual);
MemoryStream stream = new MemoryStream();
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(target));
encoder.Save(stream);
return stream;
}
如果你想要更通用的东西,我会把它分成两种方法并改变一些类型。
public BitmapSource Rasterize(Drawing drawing)
{
DrawingVisual visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawDrawing(drawing);
dc.Close();
}
RenderTargetBitmap target = new RenderTargetBitmap((int)drawing.Bounds.Right, (int)drawing.Bounds.Bottom, 96.0, 96.0, PixelFormats.Pbgra32);
target.Render(visual);
return target;
}
public void SavePng(BitmapSource source, Stream target)
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(source));
encoder.Save(target);
}
然后您可以将它用于任何类型的流。例如,要将绘图保存到文件:
using (FileStream file = File.Create("somepath.png"))
{
SavePng(Rasterize(drawingImage.Drawing), file);
}
我正在尝试将 DrawingImage 转换为 MemoryStream。我的代码如下所示:
public MemoryStream ImageStream(DrawingImage drawingImage)
{
MemoryStream stream = new MemoryStream();
ImageSource imageSource = drawingImage;
if (imageSource != null)
{
BitmapSource bitmap = imageSource as BitmapSource;
if (bitmap != null)
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(stream);
}
}
return stream;
}
但问题是在将 ImageSource 转换为 BitmapSource 位图后始终为空。任何关于如何解决这个问题的建议?
您的 bitmap
变量始终为 null 的原因是因为 DrawingImage
没有扩展 BitmapImage
或 vice-versa,因此强制转换肯定会失败。 DrawingImage
不包含任何类型的任何像素数据。它引用了一个 Drawing
,每当图像需要光栅化时都会使用它。
您是如何发现自己想要光栅化 DrawingImage
并将其序列化为流的?如果您需要这样的功能,我觉得您正在以一种不寻常的方式做某事。
不过,您可以通过将 DrawingImage
绘制到 DrawingVisual
,将其渲染到 RenderTargetBitmap
,然后将渲染目标传递给编码器以序列化来实现此功能栅格数据到流。
public MemoryStream ImageStream(DrawingImage drawingImage)
{
DrawingVisual visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawDrawing(drawingImage.Drawing);
dc.Close();
}
RenderTargetBitmap target = new RenderTargetBitmap((int)visual.Drawing.Bounds.Right, (int)visual.Drawing.Bounds.Bottom, 96.0, 96.0, PixelFormats.Pbgra32);
target.Render(visual);
MemoryStream stream = new MemoryStream();
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(target));
encoder.Save(stream);
return stream;
}
如果你想要更通用的东西,我会把它分成两种方法并改变一些类型。
public BitmapSource Rasterize(Drawing drawing)
{
DrawingVisual visual = new DrawingVisual();
using (DrawingContext dc = visual.RenderOpen())
{
dc.DrawDrawing(drawing);
dc.Close();
}
RenderTargetBitmap target = new RenderTargetBitmap((int)drawing.Bounds.Right, (int)drawing.Bounds.Bottom, 96.0, 96.0, PixelFormats.Pbgra32);
target.Render(visual);
return target;
}
public void SavePng(BitmapSource source, Stream target)
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(source));
encoder.Save(target);
}
然后您可以将它用于任何类型的流。例如,要将绘图保存到文件:
using (FileStream file = File.Create("somepath.png"))
{
SavePng(Rasterize(drawingImage.Drawing), file);
}