Проблема с сохранением растрового изображения GDI+

Bitmap bff(L"1.jpg");
bff.Save(L"2.jpg", &Gdiplus::ImageFormatJPEG, NULL);

Это создает новый файл 2.jpg с нулевой длиной байта. Разве не предполагается записать файл изображения, идентичный 1.jpg?

Почему у меня файлы нулевой длины? Я выполняю этот тест, потому что запись других растровых изображений в файлы приводит к тому же результату.


person Karim Agha    schedule 18.10.2009    source источник


Ответы (3)


Вот быстрый способ сохранить его, так как GetEncoderClsid — это пользовательская функция:

//Save to PNG
CLSID pngClsid;
CLSIDFromString(L"{557CF406-1A04-11D3-9A73-0000F81EF32E}", &pngClsid);
bmp.Save(L"file.png", &pngClsid, NULL);

и вот идентификаторы для других форматов:

bmp: {557cf400-1a04-11d3-9a73-0000f81ef32e}
jpg: {557cf401-1a04-11d3-9a73-0000f81ef32e}
gif: {557cf402-1a04-11d3-9a73-0000f81ef32e}
tif: {557cf405-1a04-11d3-9a73-0000f81ef32e}
png: {557cf406-1a04-11d3-9a73-0000f81ef32e}
person c00000fd    schedule 16.02.2017
comment
@phimuemue: чувак, это было почти 2 года назад. Я думаю, что я получил их от обращения к самой библиотеке GDI+. - person c00000fd; 11.12.2018

&Gdiplus::ImageFormatJPEG - это неправильное значение для отправки в качестве второго параметра (поэтому новый файл имеет размер 0 байт). Взгляните на пример кода в нижней части Image::Save() справочная страница, демонстрирующая правильное использование Save().

person GRB    schedule 18.10.2009
comment
Когда я использую код из примера с GetEncoderClsid, я получаю сообщение об ошибке Invalid Parameter. Возвращаемое значение метода Save равно 2. и ничего не записывается. - person Karim Agha; 18.10.2009
comment
Оглядываясь назад на свой другой вопрос, вы вызываете GetEncoderClsid(), но все же в конечном итоге передаете &Gdiplus::... в Save(). Вместо этого вы должны передать CLSID, предоставленный вам GetEncoderClsid() - person GRB; 18.10.2009
comment
Кроме того, может ли кодировщик JPEG требовать параметров? Вы передаете NULL в качестве третьего параметра, но может ли быть так, что для кодировщика JPEG параметр «качество» не является необязательным, как в этом msdn.microsoft.com/en-us/library/ms533844(VS.85).aspx пример? - person AnT; 18.10.2009
comment
AndreyT: По крайней мере, для меня Save() отлично работает с JPEG с нулевым третьим параметром. - person GRB; 18.10.2009

Насколько я знаю, вы не можете просто передать GUID формата изображения (в вашем случае «ImageFormatJPEG») методу «Image :: Save». Предполагается, что второй аргумент содержит GUID кодировщика, а не GUID формата. См. пример здесь

person AnT    schedule 18.10.2009