Преобразуйте битовый массив в PNG, в оперативной памяти в C++ (win32)

По какой-то причине ответ Кандиде не строился. Это было полезно, однако, поскольку это заставило меня найти это, которое отлично работало:

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
    {
       //your code here...
    }));
16
задан 3 revs 10 February 2009 в 06:18
поделиться

8 ответов

Я считал и пишу PNGs использование libpng, и это, кажется, имеет дело со всем, что я бросаю в него (я использовал его в модульных тестах с вещами как 257x255 изображения, и они не доставляют неприятностей). Я верю , API достаточно гибок, чтобы не быть связанным с файловым вводом-выводом (или по крайней мере можно переопределить его поведение по умолчанию, например, видеть png_set_write_fn в разделе по настройка )

На практике, я всегда использую его через намного более чистый повышение:: расширение gil PNG IO , но к сожалению который берет char* имена файлов и если Вы роете в него png_writer и file_mgr классы в его реализации, это кажется довольно связанным с FILE* (хотя, если Вы были на Linux, версия с помощью fmemopen и буферы в оперативной памяти могли бы, вероятно, быть приготовлены довольно легко).

15
ответ дан 30 November 2019 в 15:15
поделиться

LodePNG ( GitHub) является кодером/декодером lib меньше PNG.

18
ответ дан 30 November 2019 в 15:15
поделиться

На этом сайте код показывает, как преобразовывают битовый массив в 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. Я никогда не делал чего-то с ним, просто гуглил вокруг. Похож на Вас, может использовать это, все же.

11
ответ дан 30 November 2019 в 15:15
поделиться

Класс 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, все же.

7
ответ дан 30 November 2019 в 15:15
поделиться

Я использовал GDI + для сохранения битового массива как PNG в файл. Необходимо, вероятно, проверить информацию о MSDN о GDI + здесь и в особенности эта функция GdipSaveImageToStream.

Это учебное руководство здесь , вероятно, обеспечит некоторую справку также.

5
ответ дан 30 November 2019 в 15:15
поделиться

GDI (старая школа, не плюс) имеет метод GetDIBits, который может быть запрошен для вывода битов с использованием сжатия PNG (BITMAPINFOHEADER::biCompression == BI_PNG). Интересно, можно ли это использовать для создания файла PNG? Использование GetDIBits для записи стандартных растровых файлов достаточно сложно, поэтому я подозреваю, что это будет еще сложнее.

3
ответ дан 30 November 2019 в 15:15
поделиться

Если Вы хотите только использовать Windows APIs, , WIC является способом выполнить это, и он поддерживает оба Битовых массива и PNGs.

3
ответ дан 30 November 2019 в 15:15
поделиться

Вероятно, было бы лучше использовать библиотеку, а не изобретать велосипед самостоятельно.

Посмотрите на freeImage

2
ответ дан 30 November 2019 в 15:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: