#include "HGImgFmt.h" #include "HGJpeg.h" #include "HGBmp.h" #include "HGPng.h" #include "HGTiff.h" #include "HGPdf.h" #include "HGOfd.h" #include "HGGif.h" #include "HGPnm.h" #include "../base/HGInc.h" #include struct HGImgFmtReaderImpl { HGImgFmtReaderImpl() { fmtType = 0; handle = NULL; } std::string fileName; HGUInt fmtType; HGPointer handle; HGGifLoadInfo gifLoadInfo; }; struct HGImgFmtWriterImpl { HGImgFmtWriterImpl() { fmtType = 0; handle = NULL; write = HGFALSE; } std::string fileName; HGUInt fmtType; HGPointer handle; HGBool write; // 用于标记JPEG、BMP、PNG和PNM是否已经写入 }; HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) { if (NULL == fileName || NULL == fmtType) { return HGBASE_ERR_INVALIDARG; } HGBool isJpeg = HGFALSE; HGResult ret = HGImgFmt_CheckJpegFile(fileName, &isJpeg); if (isJpeg) { *fmtType = HGIMGFMT_TYPE_JPEG; return HGBASE_ERR_OK; } HGBool isBmp = HGFALSE; ret = HGImgFmt_CheckBmpFile(fileName, &isBmp); if (isBmp) { *fmtType = HGIMGFMT_TYPE_BMP; return HGBASE_ERR_OK; } HGBool isPng = HGFALSE; ret = HGImgFmt_CheckPngFile(fileName, &isPng); if (isPng) { *fmtType = HGIMGFMT_TYPE_PNG; return HGBASE_ERR_OK; } HGBool isTiff = HGFALSE; ret = HGImgFmt_CheckTiffFile(fileName, &isTiff); if (isTiff) { *fmtType = HGIMGFMT_TYPE_TIFF; return HGBASE_ERR_OK; } HGBool isPdf = HGFALSE; ret = HGImgFmt_CheckPdfFile(fileName, &isPdf); if (isPdf) { *fmtType = HGIMGFMT_TYPE_PDF; return HGBASE_ERR_OK; } HGBool isOfd = HGFALSE; ret = HGImgFmt_CheckOfdFile(fileName, &isOfd); if (isOfd) { *fmtType = HGIMGFMT_TYPE_OFD; return HGBASE_ERR_OK; } HGBool isGif = HGFALSE; ret = HGImgFmt_CheckGifFile(fileName, &isGif); if (isGif) { *fmtType = HGIMGFMT_TYPE_GIF; return HGBASE_ERR_OK; } HGBool isPnm = HGFALSE; ret = HGImgFmt_CheckPnmFile(fileName, &isPnm); if (isPnm) { *fmtType = HGIMGFMT_TYPE_PNM; return HGBASE_ERR_OK; } return ret; } HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt* fmtType) { if (NULL == fileName || NULL == fmtType) { return HGBASE_ERR_INVALIDARG; } const char* p = strrchr(fileName, '.'); if (NULL == p) { return HGBASE_ERR_INVALIDARG; } #if defined(HG_CMP_MSC) if (0 == _stricmp(p, ".jpe") || 0 == _stricmp(p, ".jpg") || 0 == _stricmp(p, ".jpeg")) { *fmtType = HGIMGFMT_TYPE_JPEG; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".bmp") || 0 == _stricmp(p, ".dib")) { *fmtType = HGIMGFMT_TYPE_BMP; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".png")) { *fmtType = HGIMGFMT_TYPE_PNG; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".tif") || 0 == _stricmp(p, ".tiff")) { *fmtType = HGIMGFMT_TYPE_TIFF; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".pdf")) { *fmtType = HGIMGFMT_TYPE_PDF; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".ofd")) { *fmtType = HGIMGFMT_TYPE_OFD; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".gif")) { *fmtType = HGIMGFMT_TYPE_GIF; return HGBASE_ERR_OK; } if (0 == _stricmp(p, ".pbm") || 0 == _stricmp(p, ".pgm") || 0 == _stricmp(p, ".ppm")) { *fmtType = HGIMGFMT_TYPE_PNM; return HGBASE_ERR_OK; } #else if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg")) { *fmtType = HGIMGFMT_TYPE_JPEG; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".bmp") || 0 == strcasecmp(p, ".dib")) { *fmtType = HGIMGFMT_TYPE_BMP; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".png")) { *fmtType = HGIMGFMT_TYPE_PNG; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".tif") || 0 == strcasecmp(p, ".tiff")) { *fmtType = HGIMGFMT_TYPE_TIFF; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".pdf")) { *fmtType = HGIMGFMT_TYPE_PDF; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".ofd")) { *fmtType = HGIMGFMT_TYPE_OFD; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".gif")) { *fmtType = HGIMGFMT_TYPE_GIF; return HGBASE_ERR_OK; } if (0 == strcasecmp(p, ".pbm") || 0 == strcasecmp(p, ".pgm") || 0 == strcasecmp(p, ".ppm")) { *fmtType = HGIMGFMT_TYPE_PNM; return HGBASE_ERR_OK; } #endif return HGBASE_ERR_FAIL; } HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti) { if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM || NULL == isMulti) { return HGBASE_ERR_INVALIDARG; } if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) *isMulti = HGFALSE; else *isMulti = HGTRUE; return HGBASE_ERR_OK; } HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) { if (fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } if (HGIMGFMT_TYPE_JPEG == fmtType) { HGJpegLoadInfo jpegInfo; HGResult ret = HGImgFmt_LoadJpegImage(fileName, &jpegInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = jpegInfo.width; info->height = jpegInfo.height; info->bpp = jpegInfo.numComponents * 8; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_JPEGDENUNIT_INCH == jpegInfo.densityUnit) { info->xDpi = jpegInfo.xDensity; info->yDpi = jpegInfo.yDensity; } else if (HGIMGFMT_JPEGDENUNIT_CENTIMETER == jpegInfo.densityUnit) { info->xDpi = (uint32_t)((double)jpegInfo.xDensity / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)jpegInfo.yDensity / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_BMP == fmtType) { HGBmpLoadInfo bmpInfo; HGResult ret = HGImgFmt_LoadBmpImage(fileName, &bmpInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = bmpInfo.width; info->height = bmpInfo.height; info->bpp = bmpInfo.bitCount; info->xDpi = (uint32_t)((double)bmpInfo.xPelsPerMeter / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)bmpInfo.yPelsPerMeter / 39.3700787 + 0.5); } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PNG == fmtType) { HGPngLoadInfo pngInfo; HGResult ret = HGImgFmt_LoadPngImage(fileName, &pngInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = pngInfo.width; info->height = pngInfo.height; info->bpp = pngInfo.pixelDepth; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_PNGPHYSUNIT_METER == pngInfo.physUnitType) { info->xDpi = (uint32_t)((double)pngInfo.xPixelsPerUnit / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)pngInfo.yPixelsPerUnit / 39.3700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_TIFF == fmtType) { HGTiffLoadInfo tiffInfo; HGResult ret = HGImgFmt_LoadTiffImage(fileName, &tiffInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = tiffInfo.width; info->height = tiffInfo.height; info->bpp = tiffInfo.bitsPerSample * tiffInfo.samplesPerPixel; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_TIFFRESUNIT_INCH == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)(tiffInfo.xResolution + 0.5f); info->yDpi = (uint32_t)(tiffInfo.yResolution + 0.5f); } else if (HGIMGFMT_TIFFRESUNIT_CENTIMETER == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)((double)tiffInfo.xResolution / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)tiffInfo.yResolution / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PDF == fmtType) { HGPdfPageInfo pdfInfo; HGResult ret = HGImgFmt_LoadPdfImage(fileName, &pdfInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = pdfInfo.width; info->height = pdfInfo.height; info->bpp = pdfInfo.bpp; info->xDpi = 0; info->yDpi = 0; } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_OFD == fmtType) { HGOfdPageInfo ofdInfo; HGResult ret = HGImgFmt_LoadOfdImage(fileName, &ofdInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = ofdInfo.width; info->height = ofdInfo.height; info->bpp = ofdInfo.bpp; info->xDpi = 0; info->yDpi = 0; } 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; } else if (HGIMGFMT_TYPE_PNM == fmtType) { HGPnmLoadInfo pnmInfo; HGResult ret = HGImgFmt_LoadPnmImage(fileName, &pnmInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = pnmInfo.width; info->height = pnmInfo.height; info->bpp = 1; if (pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_BINARY) info->bpp = 8; else if (pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_BINARY) info->bpp = 24; info->xDpi = 0; info->yDpi = 0; } return HGBASE_ERR_OK; } assert(0 == fmtType); HGJpegLoadInfo jpegInfo; HGResult ret = HGImgFmt_LoadJpegImage(fileName, &jpegInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = jpegInfo.width; info->height = jpegInfo.height; info->bpp = jpegInfo.numComponents * 8; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_JPEGDENUNIT_INCH == jpegInfo.densityUnit) { info->xDpi = jpegInfo.xDensity; info->yDpi = jpegInfo.yDensity; } else if (HGIMGFMT_JPEGDENUNIT_CENTIMETER == jpegInfo.densityUnit) { info->xDpi = (uint32_t)((double)jpegInfo.xDensity / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)jpegInfo.yDensity / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } HGBmpLoadInfo bmpInfo; ret = HGImgFmt_LoadBmpImage(fileName, &bmpInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = bmpInfo.width; info->height = bmpInfo.height; info->bpp = bmpInfo.bitCount; info->xDpi = (uint32_t)((double)bmpInfo.xPelsPerMeter / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)bmpInfo.yPelsPerMeter / 39.3700787 + 0.5); } return HGBASE_ERR_OK; } HGPngLoadInfo pngInfo; ret = HGImgFmt_LoadPngImage(fileName, &pngInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = pngInfo.width; info->height = pngInfo.height; info->bpp = pngInfo.pixelDepth; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_PNGPHYSUNIT_METER == pngInfo.physUnitType) { info->xDpi = (uint32_t)((double)pngInfo.xPixelsPerUnit / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)pngInfo.yPixelsPerUnit / 39.3700787 + 0.5); } } return HGBASE_ERR_OK; } HGTiffLoadInfo tiffInfo; ret = HGImgFmt_LoadTiffImage(fileName, &tiffInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = tiffInfo.width; info->height = tiffInfo.height; info->bpp = tiffInfo.bitsPerSample * tiffInfo.samplesPerPixel; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_TIFFRESUNIT_INCH == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)(tiffInfo.xResolution + 0.5f); info->yDpi = (uint32_t)(tiffInfo.yResolution + 0.5f); } else if (HGIMGFMT_TIFFRESUNIT_CENTIMETER == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)((double)tiffInfo.xResolution / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)tiffInfo.yResolution / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } HGPdfPageInfo pdfInfo; ret = HGImgFmt_LoadPdfImage(fileName, &pdfInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = pdfInfo.width; info->height = pdfInfo.height; info->bpp = pdfInfo.bpp; info->xDpi = 0; info->yDpi = 0; } return HGBASE_ERR_OK; } HGOfdPageInfo ofdInfo; ret = HGImgFmt_LoadOfdImage(fileName, &ofdInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = ofdInfo.width; info->height = ofdInfo.height; info->bpp = ofdInfo.bpp; info->xDpi = 0; info->yDpi = 0; } return HGBASE_ERR_OK; } HGGifLoadInfo gifInfo; ret = HGImgFmt_LoadGifImage(fileName, &gifInfo, NULL, imgType, imgOrigin, image); if (HGBASE_ERR_OK == 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; } HGPnmLoadInfo pnmInfo; ret = HGImgFmt_LoadPnmImage(fileName, &pnmInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK == ret) { if (NULL != info) { info->width = pnmInfo.width; info->height = pnmInfo.height; info->bpp = 1; if (pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_BINARY) info->bpp = 8; else if (pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_BINARY) info->bpp = 24; info->xDpi = 0; info->yDpi = 0; } return HGBASE_ERR_OK; } return ret; } HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName) { if (fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } } HGUInt xDpi = 0, yDpi = 0; HGBase_GetImageDpi(image, &xDpi, &yDpi); if (HGIMGFMT_TYPE_JPEG == fmtType) { 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_SaveJpegImage(image, pJpegInfo, fileName); } else if (HGIMGFMT_TYPE_BMP == fmtType) { HGBmpSaveInfo bmpInfo; HGBmpSaveInfo* pBmpInfo = NULL; if (NULL != info) { bmpInfo.xPelsPerMeter = (uint32_t)((double)xDpi * 39.3700787 + 0.5); bmpInfo.yPelsPerMeter = (uint32_t)((double)yDpi * 39.3700787 + 0.5); pBmpInfo = &bmpInfo; } return HGImgFmt_SaveBmpImage(image, pBmpInfo, fileName); } else if (HGIMGFMT_TYPE_PNG == fmtType) { HGPngSaveInfo pngInfo; HGPngSaveInfo* pPngInfo = NULL; if (NULL != info) { pngInfo.physUnitType = HGIMGFMT_PNGPHYSUNIT_METER; pngInfo.xPixelsPerUnit = (uint32_t)((double)xDpi * 39.3700787 + 0.5); pngInfo.yPixelsPerUnit = (uint32_t)((double)yDpi * 39.3700787 + 0.5); pPngInfo = &pngInfo; } return HGImgFmt_SavePngImage(image, pPngInfo, fileName); } else if (HGIMGFMT_TYPE_TIFF == fmtType) { HGTiffSaveInfo tiffInfo; HGTiffSaveInfo* pTiffInfo = NULL; if (NULL != info) { tiffInfo.compression = info->tiffCompression; tiffInfo.jpegQuality = info->tiffJpegQuality; tiffInfo.resolutionUnit = HGIMGFMT_TIFFRESUNIT_INCH; tiffInfo.xResolution = (float)xDpi; tiffInfo.yResolution = (float)yDpi; pTiffInfo = &tiffInfo; } return HGImgFmt_SaveTiffImage(image, pTiffInfo, fileName); } else if (HGIMGFMT_TYPE_PDF == fmtType) { 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_SavePdfJpegImage(image, pJpegInfo, fileName); } else if (HGIMGFMT_TYPE_OFD == fmtType) { 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); } else if (HGIMGFMT_TYPE_GIF == fmtType) { return HGImgFmt_SaveGifImage(image, NULL, 50, HG_MAKECOLOR(255, 255, 255, 255), fileName); } assert(HGIMGFMT_TYPE_PNM == fmtType); return HGImgFmt_SavePnmImage(image, NULL, fileName); } HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, HGImgFmtReader* reader) { if (NULL == fileName || fmtType > HGIMGFMT_TYPE_PNM || NULL == reader) { return HGBASE_ERR_INVALIDARG; } if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = fmtType; imgFmtReaderImpl->handle = NULL; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_TIFF == fmtType) { HGTiffReader tiffReader = NULL; HGResult ret = HGImgFmt_OpenTiffReader(fileName, &tiffReader); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = fmtType; imgFmtReaderImpl->handle = tiffReader; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PDF == fmtType) { HGPdfReader pdfReader = NULL; HGResult ret = HGImgFmt_OpenPdfReader(fileName, &pdfReader); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = fmtType; imgFmtReaderImpl->handle = pdfReader; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_OFD == fmtType) { HGOfdReader ofdReader = NULL; HGResult ret = HGImgFmt_OpenOfdReader(fileName, &ofdReader); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = fmtType; imgFmtReaderImpl->handle = ofdReader; *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); HGBool isJpeg = HGFALSE; HGResult ret = HGImgFmt_CheckJpegFile(fileName, &isJpeg); if (isJpeg) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_JPEG; imgFmtReaderImpl->handle = NULL; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } HGBool isBmp = HGFALSE; ret = HGImgFmt_CheckBmpFile(fileName, &isBmp); if (isBmp) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_BMP; imgFmtReaderImpl->handle = NULL; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } HGBool isPng = HGFALSE; ret = HGImgFmt_CheckPngFile(fileName, &isPng); if (isPng) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_PNG; imgFmtReaderImpl->handle = NULL; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } HGTiffReader tiffReader = NULL; ret = HGImgFmt_OpenTiffReader(fileName, &tiffReader); if (HGBASE_ERR_OK == ret) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_TIFF; imgFmtReaderImpl->handle = tiffReader; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } HGPdfReader pdfReader = NULL; ret = HGImgFmt_OpenPdfReader(fileName, &pdfReader); if (HGBASE_ERR_OK == ret) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_PDF; imgFmtReaderImpl->handle = pdfReader; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } HGOfdReader ofdReader = NULL; ret = HGImgFmt_OpenOfdReader(fileName, &ofdReader); if (HGBASE_ERR_OK == ret) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_OFD; imgFmtReaderImpl->handle = ofdReader; *reader = (HGImgFmtReader)imgFmtReaderImpl; 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; } HGBool isPnm = HGFALSE; ret = HGImgFmt_CheckPnmFile(fileName, &isPnm); if (isPnm) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; imgFmtReaderImpl->fmtType = HGIMGFMT_TYPE_PNM; imgFmtReaderImpl->handle = NULL; *reader = (HGImgFmtReader)imgFmtReaderImpl; return HGBASE_ERR_OK; } return ret; } HGResult HGAPI HGImgFmt_CloseImageReader(HGImgFmtReader reader) { if (NULL == reader) { return HGBASE_ERR_INVALIDARG; } HGImgFmtReaderImpl* imgFmtReaderImpl = (HGImgFmtReaderImpl*)reader; if (HGIMGFMT_TYPE_TIFF == imgFmtReaderImpl->fmtType) HGImgFmt_CloseTiffReader((HGTiffReader)imgFmtReaderImpl->handle); else if (HGIMGFMT_TYPE_PDF == imgFmtReaderImpl->fmtType) 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; } HGResult HGAPI HGImgFmt_GetImagePageCount(HGImgFmtReader reader, HGUInt* count) { if (NULL == reader || NULL == count) { return HGBASE_ERR_INVALIDARG; } HGImgFmtReaderImpl* imgFmtReaderImpl = (HGImgFmtReaderImpl*)reader; if (HGIMGFMT_TYPE_TIFF == imgFmtReaderImpl->fmtType) return HGImgFmt_GetTiffPageCount((HGTiffReader)imgFmtReaderImpl->handle, count); else if (HGIMGFMT_TYPE_PDF == imgFmtReaderImpl->fmtType) 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; } HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, HGImgFmtLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) { if (NULL == reader) { return HGBASE_ERR_INVALIDARG; } HGImgFmtReaderImpl* imgFmtReaderImpl = (HGImgFmtReaderImpl*)reader; if (HGIMGFMT_TYPE_JPEG == imgFmtReaderImpl->fmtType) { if (0 != index) { return HGBASE_ERR_INVALIDARG; } HGJpegLoadInfo jpegInfo; HGResult ret = HGImgFmt_LoadJpegImage(imgFmtReaderImpl->fileName.c_str(), &jpegInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = jpegInfo.width; info->height = jpegInfo.height; info->bpp = jpegInfo.numComponents * 8; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_JPEGDENUNIT_INCH == jpegInfo.densityUnit) { info->xDpi = jpegInfo.xDensity; info->yDpi = jpegInfo.yDensity; } else if (HGIMGFMT_JPEGDENUNIT_CENTIMETER == jpegInfo.densityUnit) { info->xDpi = (uint32_t)((double)jpegInfo.xDensity / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)jpegInfo.yDensity / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_BMP == imgFmtReaderImpl->fmtType) { if (0 != index) { return HGBASE_ERR_INVALIDARG; } HGBmpLoadInfo bmpInfo; HGResult ret = HGImgFmt_LoadBmpImage(imgFmtReaderImpl->fileName.c_str(), &bmpInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = bmpInfo.width; info->height = bmpInfo.height; info->bpp = bmpInfo.bitCount; info->xDpi = (uint32_t)((double)bmpInfo.xPelsPerMeter / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)bmpInfo.yPelsPerMeter / 39.3700787 + 0.5); } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PNG == imgFmtReaderImpl->fmtType) { if (0 != index) { return HGBASE_ERR_INVALIDARG; } HGPngLoadInfo pngInfo; HGResult ret = HGImgFmt_LoadPngImage(imgFmtReaderImpl->fileName.c_str(), &pngInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = pngInfo.width; info->height = pngInfo.height; info->bpp = pngInfo.pixelDepth; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_PNGPHYSUNIT_METER == pngInfo.physUnitType) { info->xDpi = (uint32_t)((double)pngInfo.xPixelsPerUnit / 39.3700787 + 0.5); info->yDpi = (uint32_t)((double)pngInfo.yPixelsPerUnit / 39.3700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_TIFF == imgFmtReaderImpl->fmtType) { HGTiffLoadInfo tiffInfo; HGResult ret = HGImgFmt_LoadImageFromTiffReader((HGTiffReader)imgFmtReaderImpl->handle, index, &tiffInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = tiffInfo.width; info->height = tiffInfo.height; info->bpp = tiffInfo.bitsPerSample * tiffInfo.samplesPerPixel; info->xDpi = 0; info->yDpi = 0; if (HGIMGFMT_TIFFRESUNIT_INCH == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)(tiffInfo.xResolution + 0.5f); info->yDpi = (uint32_t)(tiffInfo.yResolution + 0.5f); } else if (HGIMGFMT_TIFFRESUNIT_CENTIMETER == tiffInfo.resolutionUnit) { info->xDpi = (uint32_t)((double)tiffInfo.xResolution / 0.393700787 + 0.5); info->yDpi = (uint32_t)((double)tiffInfo.yResolution / 0.393700787 + 0.5); } } return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PDF == imgFmtReaderImpl->fmtType) { HGResult ret = HGBASE_ERR_OK; if (NULL != info) { info->width = 0; info->height = 0; info->bpp = 0; info->xDpi = 0; info->yDpi = 0; HGPdfPageInfo pdfInfo; ret = HGImgFmt_GetPdfPageInfo((HGPdfReader)imgFmtReaderImpl->handle, index, &pdfInfo); if (HGBASE_ERR_OK == ret) { info->width = pdfInfo.width; info->height = pdfInfo.height; info->bpp = pdfInfo.bpp; } } if (ret == HGBASE_ERR_OK && NULL != image) { ret = HGImgFmt_LoadImageFromPdfReader((HGPdfReader)imgFmtReaderImpl->handle, index, 300.0f / 72.0f, 300.0f / 72.0f, imgType, imgOrigin, image); } return ret; } else if (HGIMGFMT_TYPE_OFD == imgFmtReaderImpl->fmtType) { HGResult ret = HGBASE_ERR_OK; if (NULL != info) { info->width = 0; info->height = 0; info->bpp = 0; info->xDpi = 0; info->yDpi = 0; HGOfdPageInfo ofdInfo; ret = HGImgFmt_GetOfdPageInfo((HGOfdReader)imgFmtReaderImpl->handle, index, &ofdInfo); if (HGBASE_ERR_OK == ret) { info->width = ofdInfo.width; info->height = ofdInfo.height; info->bpp = ofdInfo.bpp; } } if (ret == HGBASE_ERR_OK && NULL != image) { ret = HGImgFmt_LoadImageFromOfdReader((HGOfdReader)imgFmtReaderImpl->handle, index, 1.0f, 1.0f, imgType, imgOrigin, image); } return ret; } else if (HGIMGFMT_TYPE_PNM == imgFmtReaderImpl->fmtType) { if (0 != index) { return HGBASE_ERR_INVALIDARG; } HGPnmLoadInfo pnmInfo; HGResult ret = HGImgFmt_LoadPnmImage(imgFmtReaderImpl->fileName.c_str(), &pnmInfo, imgType, imgOrigin, image); if (HGBASE_ERR_OK != ret) { return ret; } if (NULL != info) { info->width = pnmInfo.width; info->height = pnmInfo.height; info->bpp = 1; if (pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_GRAY_BINARY) info->bpp = 8; else if (pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_ASCII || pnmInfo.type == HGIMGFMT_PNMTYPE_RGB_BINARY) info->bpp = 24; 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 = 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_PNM || NULL == writer) { return HGBASE_ERR_INVALIDARG; } if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } } if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) { HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; imgFmtWriterImpl->handle = NULL; imgFmtWriterImpl->write = HGFALSE; *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_TIFF == fmtType) { HGTiffWriter tiffWriter = NULL; HGResult ret = HGImgFmt_OpenTiffWriter(fileName, &tiffWriter); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; imgFmtWriterImpl->handle = tiffWriter; imgFmtWriterImpl->write = HGFALSE; *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; } else if (HGIMGFMT_TYPE_PDF == fmtType) { HGPdfImageWriter pdfWriter = NULL; HGResult ret = HGImgFmt_OpenPdfImageWriter(fileName, &pdfWriter); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; imgFmtWriterImpl->handle = pdfWriter; imgFmtWriterImpl->write = HGFALSE; *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; } HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; imgFmtWriterImpl->handle = ofdWriter; imgFmtWriterImpl->write = HGFALSE; *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; } assert(HGIMGFMT_TYPE_GIF == fmtType); HGGifWriter gifWriter = NULL; HGResult ret = HGImgFmt_OpenGifWriter(fileName, NULL, &gifWriter); if (HGBASE_ERR_OK != ret) { return ret; } HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; imgFmtWriterImpl->fmtType = fmtType; imgFmtWriterImpl->handle = gifWriter; imgFmtWriterImpl->write = HGFALSE; *writer = (HGImgFmtWriter)imgFmtWriterImpl; return HGBASE_ERR_OK; } HGResult HGAPI HGImgFmt_CloseImageWriter(HGImgFmtWriter writer) { if (NULL == writer) { return HGBASE_ERR_INVALIDARG; } HGImgFmtWriterImpl* imgFmtWriterImpl = (HGImgFmtWriterImpl*)writer; if (HGIMGFMT_TYPE_TIFF == imgFmtWriterImpl->fmtType) HGImgFmt_CloseTiffWriter((HGTiffWriter)imgFmtWriterImpl->handle); else if (HGIMGFMT_TYPE_PDF == imgFmtWriterImpl->fmtType) 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; } HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, const HGImgFmtSaveInfo* info) { if (NULL == writer) { return HGBASE_ERR_INVALIDARG; } HGUInt xDpi = 0, yDpi = 0; HGBase_GetImageDpi(image, &xDpi, &yDpi); HGImgFmtWriterImpl* imgFmtWriterImpl = (HGImgFmtWriterImpl*)writer; if (HGIMGFMT_TYPE_JPEG == imgFmtWriterImpl->fmtType) { if (imgFmtWriterImpl->write) { return HGBASE_ERR_FAIL; } 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; } HGResult ret = HGImgFmt_SaveJpegImage(image, pJpegInfo, imgFmtWriterImpl->fileName.c_str()); if (HGBASE_ERR_OK == ret) { imgFmtWriterImpl->write = HGTRUE; } return ret; } else if (HGIMGFMT_TYPE_BMP == imgFmtWriterImpl->fmtType) { if (imgFmtWriterImpl->write) { return HGBASE_ERR_FAIL; } HGBmpSaveInfo bmpInfo; HGBmpSaveInfo* pBmpInfo = NULL; if (NULL != info) { bmpInfo.xPelsPerMeter = (uint32_t)((double)xDpi * 39.3700787 + 0.5); bmpInfo.yPelsPerMeter = (uint32_t)((double)yDpi * 39.3700787 + 0.5); pBmpInfo = &bmpInfo; } HGResult ret = HGImgFmt_SaveBmpImage(image, pBmpInfo, imgFmtWriterImpl->fileName.c_str()); if (HGBASE_ERR_OK == ret) { imgFmtWriterImpl->write = HGTRUE; } return ret; } else if (HGIMGFMT_TYPE_PNG == imgFmtWriterImpl->fmtType) { if (imgFmtWriterImpl->write) { return HGBASE_ERR_FAIL; } HGPngSaveInfo pngInfo; HGPngSaveInfo* pPngInfo = NULL; if (NULL != info) { pngInfo.physUnitType = HGIMGFMT_PNGPHYSUNIT_METER; pngInfo.xPixelsPerUnit = (uint32_t)((double)xDpi * 39.3700787 + 0.5); pngInfo.yPixelsPerUnit = (uint32_t)((double)yDpi * 39.3700787 + 0.5); pPngInfo = &pngInfo; } HGResult ret = HGImgFmt_SavePngImage(image, pPngInfo, imgFmtWriterImpl->fileName.c_str()); if (HGBASE_ERR_OK == ret) { imgFmtWriterImpl->write = HGTRUE; } return ret; } else if (HGIMGFMT_TYPE_TIFF == imgFmtWriterImpl->fmtType) { HGTiffSaveInfo tiffInfo; HGTiffSaveInfo* pTiffInfo = NULL; if (NULL != info) { tiffInfo.compression = info->tiffCompression; tiffInfo.jpegQuality = info->tiffJpegQuality; tiffInfo.resolutionUnit = HGIMGFMT_TIFFRESUNIT_INCH; tiffInfo.xResolution = (float)xDpi; tiffInfo.yResolution = (float)yDpi; pTiffInfo = &tiffInfo; } return HGImgFmt_SaveImageToTiffWriter((HGTiffWriter)imgFmtWriterImpl->handle, image, pTiffInfo); } else if (HGIMGFMT_TYPE_PDF == imgFmtWriterImpl->fmtType) { 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_SaveJpegImageToPdfImageWriter((HGPdfImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo); } else if (HGIMGFMT_TYPE_OFD == imgFmtWriterImpl->fmtType) { 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); } else if (HGIMGFMT_TYPE_PNM == imgFmtWriterImpl->fmtType) { if (imgFmtWriterImpl->write) { return HGBASE_ERR_FAIL; } HGResult ret = HGImgFmt_SavePnmImage(image, NULL, imgFmtWriterImpl->fileName.c_str()); if (HGBASE_ERR_OK == ret) { imgFmtWriterImpl->write = HGTRUE; } return ret; } assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType); return HGImgFmt_SaveImageToGifWriter((HGGifWriter)imgFmtWriterImpl->handle, 50, HG_MAKECOLOR(255, 255, 255, 255), image); }