C# 如何将图元文件(emf)输出到流(或字节[])中

C# 如何将图元文件(emf)输出到流(或字节[])中,c#,memorystream,metafile,C#,Memorystream,Metafile,对于我目前正在开发的应用程序,我需要创建一个.emf文件。 当我把结果直接输出到一个文件中时,我已经让它工作了,但是我不能让它输出到一个流中,这对于我要做的事情是至关重要的 这段代码正确地生成了文件,但它直接输出到硬盘 var sizedImage = new Bitmap(103, 67); using(var graphicsFromSizedImage = Graphics.FromImage(sizedImage)) using(var metafile = new Metafile("

对于我目前正在开发的应用程序,我需要创建一个.emf文件。 当我把结果直接输出到一个文件中时,我已经让它工作了,但是我不能让它输出到一个流中,这对于我要做的事情是至关重要的

这段代码正确地生成了文件,但它直接输出到硬盘

var sizedImage = new Bitmap(103, 67);
using(var graphicsFromSizedImage = Graphics.FromImage(sizedImage))
using(var metafile = new Metafile("result.emf", graphicsFromSizedImage.GetHdc()))
using(var graphics = Graphics.FromImage(metafile))
{
    graphics.DrawStuff()
    graphicsFromSizedImage.ReleaseHdc();
}
下面是我将其输出到memorystream的尝试,以便从该流中获取字节[]:

byte[] resultingBytes;
var sizedImage = new Bitmap(103, 67);
using(var stream = new MemoryStream())
using(var graphicsFromSizedImage = Graphics.FromImage(sizedImage))
using(var metafile = new Metafile(stream, graphicsFromSizedImage.GetHdc()))
using(var graphics = Graphics.FromImage(metafile))
{
    graphics.DrawStuff()
    graphicsFromSizedImage.ReleaseHdc();
    resultingBytes = stream.GetBuffer();
}
File.WriteAllBytes("result.emf", resultingBytes);
但所有这些只是创建一个空文件。当我用调试器运行它时,我可以看到流仍然是空的。
我在这里遗漏了什么?

多亏了你,我才找到了答案

事实证明,只有在处理“图形”对象时,更改才会写入MemoryStream。因此,只需添加一组额外的分支,问题就解决了

这是我的工作代码:

byte[] resultingBytes;
var sizedImage = new Bitmap(103, 67);
using(var stream = new MemoryStream())
using(var graphicsFromSizedImage = Graphics.FromImage(sizedImage))
using(var metafile = new Metafile(stream, graphicsFromSizedImage.GetHdc()))
{
    using(var graphics = Graphics.FromImage(metafile))
    {
        graphics.DrawStuff()
        graphicsFromSizedImage.ReleaseHdc();
    }
    resultingBytes = stream.ToArray();
}
File.WriteAllBytes("result.emf", resultingBytes);

编辑:正如一些人指出的,stream.GetBuffer()将返回整个缓冲区。我将其更改为stream.ToArray(),这应该更好

graphics=graphics.FromImage(sizeImage)
然后
sizeImage.Save(“result.emf”)有什么问题
@Selvin从我读到的内容来看,这不会有正确的结果。在写入内存流之前,将位置设置为零。这对我来说是有效的
GetBuffer
返回整个底层缓冲区,而不仅仅是写入的字节。即使代码按预期工作,结果肯定会包含无关数据。