将HGGif集成到HGImgFmt.h中

This commit is contained in:
luoliangyi 2022-07-12 11:23:34 +08:00
parent 7f15550da1
commit 238f92fc71
4 changed files with 206 additions and 46 deletions

View File

@ -5,6 +5,7 @@
#include "HGTiff.h"
#include "HGPdf.h"
#include "HGOfd.h"
#include "HGGif.h"
#include "../base/HGInc.h"
#include <string>
@ -19,6 +20,7 @@ struct HGImgFmtReaderImpl
std::string fileName;
HGUInt fmtType;
HGPointer handle;
HGGifLoadInfo gifLoadInfo;
};
struct HGImgFmtWriterImpl
@ -91,6 +93,14 @@ HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType)
return HGBASE_ERR_OK;
}
HGBool isGif = HGFALSE;
HGImgFmt_CheckGifFile(fileName, &isGif);
if (isGif)
{
*fmtType = HGIMGFMT_TYPE_GIF;
return HGBASE_ERR_OK;
}
return HGBASE_ERR_FAIL;
}
@ -143,6 +153,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
*fmtType = HGIMGFMT_TYPE_OFD;
return HGBASE_ERR_OK;
}
if (0 == _stricmp(p, ".gif"))
{
*fmtType = HGIMGFMT_TYPE_GIF;
return HGBASE_ERR_OK;
}
#else
if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg"))
{
@ -179,6 +195,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
*fmtType = HGIMGFMT_TYPE_OFD;
return HGBASE_ERR_OK;
}
if (0 == strcasecmp(p, ".gif"))
{
*fmtType = HGIMGFMT_TYPE_GIF;
return HGBASE_ERR_OK;
}
#endif
return HGBASE_ERR_FAIL;
@ -186,7 +208,7 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti)
{
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD || NULL == isMulti)
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF || NULL == isMulti)
{
return HGBASE_ERR_INVALIDARG;
}
@ -201,7 +223,7 @@ HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti)
HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info,
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
{
if (fmtType > HGIMGFMT_TYPE_OFD)
if (fmtType > HGIMGFMT_TYPE_GIF)
{
return HGBASE_ERR_INVALIDARG;
}
@ -349,6 +371,26 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
return HGBASE_ERR_OK;
}
else if (HGIMGFMT_TYPE_GIF == fmtType)
{
HGGifLoadInfo gifInfo;
HGResult ret = HGImgFmt_LoadGifImage(fileName, &gifInfo, NULL, imgType, imgOrigin, image);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
if (NULL != info)
{
info->width = gifInfo.width;
info->height = gifInfo.height;
info->bpp = gifInfo.colorResolution;
info->xDpi = 0;
info->yDpi = 0;
}
return HGBASE_ERR_OK;
}
assert(0 == fmtType);
@ -465,12 +507,27 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
return HGBASE_ERR_OK;
}
HGGifLoadInfo gifInfo;
if (HGBASE_ERR_OK == HGImgFmt_LoadGifImage(fileName, &gifInfo, NULL, imgType, imgOrigin, image))
{
if (NULL != info)
{
info->width = gifInfo.width;
info->height = gifInfo.height;
info->bpp = gifInfo.colorResolution;
info->xDpi = 0;
info->yDpi = 0;
}
return HGBASE_ERR_OK;
}
return HGBASE_ERR_FAIL;
}
HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName)
{
if (fmtType > HGIMGFMT_TYPE_OFD)
if (fmtType > HGIMGFMT_TYPE_GIF)
{
return HGBASE_ERR_INVALIDARG;
}
@ -478,7 +535,7 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS
if (0 == fmtType)
{
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType);
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD)
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF)
{
return HGBASE_ERR_INVALIDARG;
}
@ -565,27 +622,31 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS
return HGImgFmt_SavePdfJpegImage(image, pJpegInfo, fileName);
}
assert(HGIMGFMT_TYPE_OFD == fmtType);
HGJpegSaveInfo jpegInfo;
HGJpegSaveInfo* pJpegInfo = NULL;
if (NULL != info)
else if (HGIMGFMT_TYPE_OFD == fmtType)
{
jpegInfo.quality = info->jpegQuality;
jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH;
jpegInfo.xDensity = xDpi;
jpegInfo.yDensity = yDpi;
pJpegInfo = &jpegInfo;
HGJpegSaveInfo jpegInfo;
HGJpegSaveInfo* pJpegInfo = NULL;
if (NULL != info)
{
jpegInfo.quality = info->jpegQuality;
jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH;
jpegInfo.xDensity = xDpi;
jpegInfo.yDensity = yDpi;
pJpegInfo = &jpegInfo;
}
return HGImgFmt_SaveOfdJpegImage(image, pJpegInfo, fileName);
}
return HGImgFmt_SaveOfdJpegImage(image, pJpegInfo, fileName);
assert(HGIMGFMT_TYPE_GIF == fmtType);
return HGImgFmt_SaveGifImage(image, NULL, 0, fileName);
}
HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, HGImgFmtReader* reader)
{
if (NULL == fileName || fmtType > HGIMGFMT_TYPE_OFD || NULL == reader)
if (NULL == fileName || fmtType > HGIMGFMT_TYPE_GIF || NULL == reader)
{
return HGBASE_ERR_INVALIDARG;
}
@ -648,6 +709,24 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType,
*reader = (HGImgFmtReader)imgFmtReaderImpl;
return HGBASE_ERR_OK;
}
else if (HGIMGFMT_TYPE_GIF == fmtType)
{
HGGifLoadInfo gifLoadInfo;
HGGifReader gifReader = NULL;
HGResult ret = HGImgFmt_OpenGifReader(fileName, &gifLoadInfo, &gifReader);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl;
imgFmtReaderImpl->fileName = fileName;
imgFmtReaderImpl->fmtType = fmtType;
imgFmtReaderImpl->handle = gifReader;
memcpy(&imgFmtReaderImpl->gifLoadInfo, &gifLoadInfo, sizeof(HGGifLoadInfo));
*reader = (HGImgFmtReader)imgFmtReaderImpl;
return HGBASE_ERR_OK;
}
assert(0 == fmtType);
@ -723,6 +802,20 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType,
return HGBASE_ERR_OK;
}
HGGifLoadInfo gifLoadInfo;
HGGifReader gifReader = NULL;
ret = HGImgFmt_OpenGifReader(fileName, &gifLoadInfo, &gifReader);
if (HGBASE_ERR_OK == ret)
{
HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl;
imgFmtReaderImpl->fileName = fileName;
imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_GIF;
imgFmtReaderImpl->handle = gifReader;
memcpy(&imgFmtReaderImpl->gifLoadInfo, &gifLoadInfo, sizeof(HGGifLoadInfo));
*reader = (HGImgFmtReader)imgFmtReaderImpl;
return HGBASE_ERR_OK;
}
return HGBASE_ERR_FAIL;
}
@ -740,6 +833,8 @@ HGResult HGAPI HGImgFmt_CloseImageReader(HGImgFmtReader reader)
HGImgFmt_ClosePdfReader((HGPdfReader)imgFmtReaderImpl->handle);
else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType)
HGImgFmt_CloseOfdReader((HGOfdReader)imgFmtReaderImpl->handle);
else if (HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType)
HGImgFmt_CloseGifReader((HGGifReader)imgFmtReaderImpl->handle);
delete imgFmtReaderImpl;
return HGBASE_ERR_OK;
@ -759,6 +854,11 @@ HGResult HGAPI HGImgFmt_GetImagePageCount(HGImgFmtReader reader, HGUInt* count)
return HGImgFmt_GetPdfPageCount((HGPdfReader)imgFmtReaderImpl->handle, count);
else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType)
return HGImgFmt_GetOfdPageCount((HGOfdReader)imgFmtReaderImpl->handle, count);
else if (HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType)
{
*count = imgFmtReaderImpl->gifLoadInfo.imageCount;
return HGBASE_ERR_OK;
}
*count = 1;
return HGBASE_ERR_OK;
@ -912,30 +1012,65 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index,
return HGBASE_ERR_OK;
}
assert(HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType);
HGResult ret = HGImgFmt_LoadImageFromOfdReader((HGOfdReader)imgFmtReaderImpl->handle, index, 1.0f, 1.0f, imgType, imgOrigin, image);
if (HGBASE_ERR_OK != ret)
else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType)
{
return ret;
HGResult ret = HGImgFmt_LoadImageFromOfdReader((HGOfdReader)imgFmtReaderImpl->handle, index, 1.0f, 1.0f, imgType, imgOrigin, image);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
if (NULL != info)
{
info->width = 0;
info->height = 0;
info->bpp = 0;
info->xDpi = 0;
info->yDpi = 0;
}
return HGBASE_ERR_OK;
}
assert(HGIMGFMT_TYPE_GIF == imgFmtReaderImpl->fmtType);
if (NULL == image)
{
if (0 != imgType || 0 != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
}
if (index >= imgFmtReaderImpl->gifLoadInfo.imageCount)
{
return HGBASE_ERR_INVALIDARG;
}
if (NULL != info)
{
info->width = 0;
info->height = 0;
info->bpp = 0;
info->width = imgFmtReaderImpl->gifLoadInfo.width;
info->height = imgFmtReaderImpl->gifLoadInfo.height;
info->bpp = imgFmtReaderImpl->gifLoadInfo.colorResolution;
info->xDpi = 0;
info->yDpi = 0;
}
if (NULL != image)
{
HGResult ret = HGImgFmt_LoadImageFromGifReader((HGGifReader)imgFmtReaderImpl->handle, index, NULL, imgType, imgOrigin, image);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
}
return HGBASE_ERR_OK;
}
HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriter* writer)
{
if (fmtType > HGIMGFMT_TYPE_OFD || NULL == writer)
if (fmtType > HGIMGFMT_TYPE_GIF || NULL == writer)
{
return HGBASE_ERR_INVALIDARG;
}
@ -943,7 +1078,7 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType,
if (0 == fmtType)
{
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType);
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_OFD)
if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF)
{
return HGBASE_ERR_INVALIDARG;
}
@ -994,11 +1129,28 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType,
*writer = (HGImgFmtWriter)imgFmtWriterImpl;
return HGBASE_ERR_OK;
}
else if (HGIMGFMT_TYPE_OFD == fmtType)
{
HGOfdImageWriter ofdWriter = NULL;
HGResult ret = HGImgFmt_OpenOfdImageWriter(fileName, &ofdWriter);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
assert(HGIMGFMT_TYPE_OFD == fmtType);
HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl;
imgFmtWriterImpl->fileName = fileName;
imgFmtWriterImpl->fmtType = fmtType;
imgFmtWriterImpl->handle = ofdWriter;
imgFmtWriterImpl->write = HGFALSE;
*writer = (HGImgFmtWriter)imgFmtWriterImpl;
return HGBASE_ERR_OK;
}
HGOfdImageWriter ofdWriter = NULL;
HGResult ret = HGImgFmt_OpenOfdImageWriter(fileName, &ofdWriter);
assert(HGIMGFMT_TYPE_GIF == fmtType);
HGGifWriter gifWriter = NULL;
HGResult ret = HGImgFmt_OpenGifWriter(fileName, NULL, &gifWriter);
if (HGBASE_ERR_OK != ret)
{
return ret;
@ -1007,7 +1159,7 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType,
HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl;
imgFmtWriterImpl->fileName = fileName;
imgFmtWriterImpl->fmtType = fmtType;
imgFmtWriterImpl->handle = ofdWriter;
imgFmtWriterImpl->handle = gifWriter;
imgFmtWriterImpl->write = HGFALSE;
*writer = (HGImgFmtWriter)imgFmtWriterImpl;
return HGBASE_ERR_OK;
@ -1027,6 +1179,8 @@ HGResult HGAPI HGImgFmt_CloseImageWriter(HGImgFmtWriter writer)
HGImgFmt_ClosePdfImageWriter((HGPdfImageWriter)imgFmtWriterImpl->handle);
else if (HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType)
HGImgFmt_CloseOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle);
else if (HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType)
HGImgFmt_CloseGifWriter((HGGifWriter)imgFmtWriterImpl->handle);
delete imgFmtWriterImpl;
return HGBASE_ERR_OK;
@ -1154,20 +1308,24 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image,
return HGImgFmt_SaveJpegImageToPdfImageWriter((HGPdfImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo);
}
assert(HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType);
HGJpegSaveInfo jpegInfo;
HGJpegSaveInfo* pJpegInfo = NULL;
if (NULL != info)
else if (HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType)
{
jpegInfo.quality = info->jpegQuality;
jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH;
jpegInfo.xDensity = xDpi;
jpegInfo.yDensity = yDpi;
pJpegInfo = &jpegInfo;
HGJpegSaveInfo jpegInfo;
HGJpegSaveInfo* pJpegInfo = NULL;
if (NULL != info)
{
jpegInfo.quality = info->jpegQuality;
jpegInfo.densityUnit = HGIMGFMT_JPEGDENUNIT_INCH;
jpegInfo.xDensity = xDpi;
jpegInfo.yDensity = yDpi;
pJpegInfo = &jpegInfo;
}
return HGImgFmt_SaveJpegImageToOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo);
}
return HGImgFmt_SaveJpegImageToOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo);
assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType);
return HGImgFmt_SaveImageToGifWriter((HGGifWriter)imgFmtWriterImpl->handle, 0, image);
}

View File

@ -22,6 +22,8 @@ HG_DECLARE_HANDLE(HGImgFmtWriter);
#define HGIMGFMT_TYPE_PDF 5L
/* OFD */
#define HGIMGFMT_TYPE_OFD 6L
/* GIF */
#define HGIMGFMT_TYPE_GIF 7L
typedef struct
{

Binary file not shown.

Binary file not shown.