CImage: копирование 8-битных JPEG дает черное изображение

В следующем фрагменте кода я загружаю 8-битный JPEG 300DPI, а затем снова пытаюсь записать его в Fresh-экземпляр CImage, также в виде JPEG.

Но я получаю черное изображение с правильными размерами.

Может кто-нибудь объяснить, почему это так?

Игнорируйте закомментированные линии кисти, я преодолею это умственное препятствие позже.

Если я жестко закодирую bppGraphic в 24, он скопирует изображение (с разрешением 96), что приведет к уменьшению размера файла. Я могу жить с этим, я думаю, мне просто любопытно.

Обновление 07-ноя-2018

Поэтому я добавил оператор «если» с отступом, и он все еще получился черным. ColorCountIMAGE выходит в 20. (Строки IsIndexed должны были помочь мне с проблемой ASSERT, которую я обнаружил в SetColorTable — но она исчезла)

Я думаю, что я могу просто заставить все 24 бит.

Спасибо

4GLGuy
PS Это все делается в VS2017.

char filePath[256] = "C:\\temp\\b64-one.jpg";
CImage imageGRAPHIC, imageJPG;

HRESULT retval;
bool result;

retval = imageGRAPHIC.Load(filePath);
if (retval != S_OK) {
throw FALSE;
}

int xGRAPHIC, yGRAPHIC, bppGRAPHIC = 0;
xGRAPHIC = imageGRAPHIC.GetWidth();
yGRAPHIC = imageGRAPHIC.GetHeight();
bppGRAPHIC = imageGRAPHIC.GetBPP();

//Create my target JPG same size and bit depth specifying
//that there is no alpha channel (dwflag last param)
result = imageJPG.Create(xGRAPHIC, yGRAPHIC, bppGRAPHIC, 0);
auto dcJPEG = imageJPG.GetDC();if (bppGRAPHIC <= 8)
{

result = imageJPG.IsIndexed();
result = imageGRAPHIC.IsIndexed();
auto dcIMAGE = imageGRAPHIC.GetDC();

int colorCountIMAGE = GetDeviceCaps(dcIMAGE, NUMCOLORS);

RGBQUAD* coltblIMAGE = new RGBQUAD[colorCountIMAGE];
imageGRAPHIC.GetColorTable(0, colorCountIMAGE, &coltblIMAGE[0]);
imageJPG.SetColorTable(0, colorCountIMAGE, &coltblIMAGE[0]);

}//Let there be white - 8 bit depth with 24 bit brush - no worky
//CRect rect{ 0, 0, xGRAPHIC, yGRAPHIC };
//HBRUSH white = CreateSolidBrush(RGB(255, 255, 255));
//FillRect(dcJPEG, &rect, white);

result = imageGRAPHIC.Draw(dcJPEG, 0, 0);

retval = imageJPG.Save(filePath, Gdiplus::ImageFormatJPEG);
if (retval != S_OK) {
throw FALSE;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector