load JPG images as rbg instead of rgba, fixes #21867

This commit is contained in:
Simon Wenner 2018-10-04 00:12:00 +02:00
parent caa141a1ac
commit 45498caa49
1 changed files with 17 additions and 5 deletions

View File

@ -48,9 +48,9 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p
const int image_width = decoder.get_width(); const int image_width = decoder.get_width();
const int image_height = decoder.get_height(); const int image_height = decoder.get_height();
int comps = decoder.get_num_components(); const int comps = decoder.get_num_components();
if (comps == 3) if (comps != 1 && comps != 3)
comps = 4; //weird return ERR_FILE_CORRUPT;
if (decoder.begin_decoding() != jpgd::JPGD_SUCCESS) if (decoder.begin_decoding() != jpgd::JPGD_SUCCESS)
return ERR_FILE_CORRUPT; return ERR_FILE_CORRUPT;
@ -73,7 +73,19 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p
} }
jpgd::uint8 *pDst = pImage_data + y * dst_bpl; jpgd::uint8 *pDst = pImage_data + y * dst_bpl;
memcpy(pDst, pScan_line, dst_bpl);
if (comps == 1) {
memcpy(pDst, pScan_line, dst_bpl);
} else {
// For images with more than 1 channel pScan_line will always point to a buffer
// containing 32-bit RGBA pixels. Alpha is always 255 and we ignore it.
for (int x = 0; x < image_width; x++) {
pDst[0] = pScan_line[x * 4 + 0];
pDst[1] = pScan_line[x * 4 + 1];
pDst[2] = pScan_line[x * 4 + 2];
pDst += 3;
}
}
} }
//all good //all good
@ -82,7 +94,7 @@ Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p
if (comps == 1) if (comps == 1)
fmt = Image::FORMAT_L8; fmt = Image::FORMAT_L8;
else else
fmt = Image::FORMAT_RGBA8; fmt = Image::FORMAT_RGB8;
dw = PoolVector<uint8_t>::Write(); dw = PoolVector<uint8_t>::Write();
p_image->create(image_width, image_height, 0, fmt, data); p_image->create(image_width, image_height, 0, fmt, data);