По какой-то причине ответ Кандиде не строился. Это было полезно, однако, поскольку это заставило меня найти это, которое отлично работало:
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
//your code here...
}));
Я считал и пишу PNGs использование libpng, и это, кажется, имеет дело со всем, что я бросаю в него (я использовал его в модульных тестах с вещами как 257x255 изображения, и они не доставляют неприятностей). Я верю , API достаточно гибок, чтобы не быть связанным с файловым вводом-выводом (или по крайней мере можно переопределить его поведение по умолчанию, например, видеть png_set_write_fn
в разделе по настройка )
На практике, я всегда использую его через намного более чистый повышение:: расширение gil PNG IO , но к сожалению который берет char*
имена файлов и если Вы роете в него png_writer
и file_mgr
классы в его реализации, это кажется довольно связанным с FILE*
(хотя, если Вы были на Linux, версия с помощью fmemopen и буферы в оперативной памяти могли бы, вероятно, быть приготовлены довольно легко).
На этом сайте код показывает, как преобразовывают битовый массив в PNG, пишущий его в файл: http://dotnet-snippets.de/dns/gdi-speichern-eines-png-SID814.aspx . Вместо того, чтобы писать в файл, Save
метод Битового массива также поддерживает запись в IStream
( http://msdn.microsoft.com/en-us/library/ms535406%28VS.85%29.aspx ). Можно создать Поток, сохраненный памятью с помощью CreateStreamOnHGlobal
API-функция. ( http://msdn.microsoft.com/en-us/library/aa378980%28VS.85%29.aspx ). Библиотека, которой пользуются, GDI +, включена в Windows от WindowsXP и работает в Windows от Windows98. Я никогда не делал чего-то с ним, просто гуглил вокруг. Похож на Вас, может использовать это, все же.
Класс CImage (ATL/MFC) сохранение поддержек в формат PNG. Как GDI + решение, это также поддерживает сохранение к потоку. Вот некоторый код, который я использую для сохранения его к CByteArray:
CByteArray baPicture;
IStream *pStream = NULL;
if (CreateStreamOnHGlobal(NULL, TRUE, &pStream) == S_OK)
{
if (image.Save(pStream, Gdiplus::ImageFormatPNG) == S_OK)
{
ULARGE_INTEGER ulnSize;
LARGE_INTEGER lnOffset;
lnOffset.QuadPart = 0;
if (pStream->Seek(lnOffset, STREAM_SEEK_END, &ulnSize) == S_OK)
{
if (pStream->Seek(lnOffset, STREAM_SEEK_SET, NULL) == S_OK)
{
baPicture.SetSize(ulnSize.QuadPart);
ULONG ulBytesRead;
pStream->Read(baPicture.GetData(), ulnSize.QuadPart, &ulBytesRead);
}
}
}
}
pStream->Release();
я не знаю, хотели ли Вы использовать ATL или MFC, все же.
Я использовал GDI + для сохранения битового массива как PNG в файл. Необходимо, вероятно, проверить информацию о MSDN о GDI + здесь и в особенности эта функция GdipSaveImageToStream.
Это учебное руководство здесь , вероятно, обеспечит некоторую справку также.
GDI (старая школа, не плюс) имеет метод GetDIBits
, который может быть запрошен для вывода битов с использованием сжатия PNG (BITMAPINFOHEADER::biCompression
== BI_PNG
). Интересно, можно ли это использовать для создания файла PNG? Использование GetDIBits
для записи стандартных растровых файлов достаточно сложно, поэтому я подозреваю, что это будет еще сложнее.
Если Вы хотите только использовать Windows APIs, , WIC является способом выполнить это, и он поддерживает оба Битовых массива и PNGs.
Вероятно, было бы лучше использовать библиотеку, а не изобретать велосипед самостоятельно.
Посмотрите на freeImage