【问题标题】:How to output Metafile (emf) into stream (or byte[])如何将元文件(emf)输出到流(或字节 [])中
【发布时间】:2020-05-12 22:02:03
【问题描述】:

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

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

【问题讨论】:

  • graphics = Graphics.FromImage(sizedImage) 和sizedImage.Save("result.emf) 有什么问题
  • @Selvin 根据我的阅读,这不会有正确的结果。
  • 在写入内存流之前将位置设置为零。
  • 这对我有用dotnetfiddle.net/eD5vsh
  • GetBuffer 返回整个底层缓冲区,而不仅仅是写入的字节。即使代码确实按预期工作,结果肯定会包含无关数据。

标签: c# memorystream metafile


【解决方案1】:

感谢@Selvin,我找到了答案

事实证明,只有在释放“图形”对象时,更改才会写入 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(),应该会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2012-12-15
    • 2019-10-06
    • 1970-01-01
    • 2014-06-11
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多