解决非4字节对齐的HGImage保存BMP出错的问题

This commit is contained in:
luoliangyi 2022-05-27 21:02:26 +08:00
parent 5e2ada3e39
commit 9395fb94f7
2 changed files with 35 additions and 1 deletions

View File

@ -2793,7 +2793,10 @@ static inline void SetBit(HGByte* data, HGUInt index, HGByte value)
assert(0 == value || 1 == value); assert(0 == value || 1 == value);
HGUInt byteIndex = index / 8; HGUInt byteIndex = index / 8;
HGUInt bitIndex = index % 8; HGUInt bitIndex = index % 8;
data[byteIndex] |= (value << (7 - bitIndex)); if (1 == value)
data[byteIndex] |= (1 << (7 - bitIndex));
else
data[byteIndex] &= ~(1 << (7 - bitIndex));
} }
static HGResult CopyImageWithBinary(HGImageImpl *srcImageImpl, HGImageImpl *destImageImpl) static HGResult CopyImageWithBinary(HGImageImpl *srcImageImpl, HGImageImpl *destImageImpl)

View File

@ -258,6 +258,37 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
uint32_t type = imgInfo.type; uint32_t type = imgInfo.type;
uint32_t origin = imgInfo.origin; uint32_t origin = imgInfo.origin;
HGUInt bpp = 0;
if (HGBASE_IMGTYPE_BINARY == type)
bpp = 1;
else if (HGBASE_IMGTYPE_GRAY == type)
bpp = 8;
else if (HGBASE_IMGTYPE_BGR == type || HGBASE_IMGTYPE_RGB == type)
bpp = 24;
else if (HGBASE_IMGTYPE_BGRA == type || HGBASE_IMGTYPE_RGBA == type)
bpp = 32;
assert(0 != bpp);
HGUInt stdWidthStep = ((width * bpp + 31) & ~31) >> 3;
if (widthStep != stdWidthStep)
{
HGImage imgTemp = NULL;
HGImageRoi imageRoi;
HGBase_GetImageROI(image, &imageRoi);
HGBase_ResetImageROI(image);
HGResult ret = HGBase_CloneImage(image, 0, 0, &imgTemp);
HGBase_SetImageROI(image, &imageRoi);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
ret = HGImgFmt_SaveBmpImage(imgTemp, info, fileName);
HGBase_DestroyImage(imgTemp);
return ret;
}
FILE* file = fopen(fileName, "wb"); FILE* file = fopen(fileName, "wb");
if (NULL == file) if (NULL == file)
{ {