Как вывести метафайл (emf) в поток (или byte []) - PullRequest
1 голос
/ 27 января 2020

Для приложения, которое я сейчас разрабатываю, мне нужно создать файл .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);

Но все это создает пустой файл. Когда я запускаю его с помощью отладчика, я вижу, что поток остается пустым. Что мне здесь не хватает ..?

1 Ответ

1 голос
/ 27 января 2020

Я нашел ответ благодаря @ Selvin

Оказывается, изменения записываются в MemoryStream только при удалении объекта «graphics». Итак, просто добавив дополнительный набор ветвей, проблема будет решена.

Вот мой рабочий код:

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 (), который должен быть лучше.

...