首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将图元文件(emf)输出为流(或byte[])

如何将图元文件(emf)输出为流(或byte[])
EN

Stack Overflow用户
提问于 2020-01-27 21:59:22
回答 1查看 314关注 0票数 2

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

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

代码语言:javascript
复制
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[]:

代码语言:javascript
复制
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);

但这样做只会创建一个空文件。当我使用调试器运行它时,我可以看到流仍然是空的。我错过了什么..?

EN

回答 1

Stack Overflow用户

发布于 2020-01-27 23:29:37

多亏了@Selvin我找到了答案

事实证明,只有当“MemoryStream”对象被释放时,更改才会被写入图形。因此,只需添加一组额外的brances,问题就解决了。

下面是我的工作代码:

代码语言:javascript
复制
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);

Edit:正如一些人指出的那样,stream.GetBuffer()将返回整个缓冲区。我把它改成了stream.ToArray(),这样应该更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59932650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档