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

问题描述 投票:1回答:1

对于我当前正在开发的应用程序,我需要创建一个.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();
}

这是我尝试将其输出到内存流,因此我可以从该流中获取一个字节[]:

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);

但是所有要做的就是创建一个空文件。当我使用调试器运行它时,我可以看到流保持为空。我在这里想念的是什么?。

c# memorystream metafile
1个回答
1
投票

由于@Selvin,我找到了答案

事实是,仅在放置“图形”对象时,更改才会写入MemoryStream。因此,只需添加一组额外的brances,即可解决此问题。

这是我的工作代码:

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(),应该更好。

© www.soinside.com 2019 - 2024. All rights reserved.