diff --git a/build/windows/HGImgFmt/HGImgFmt.def b/build/windows/HGImgFmt/HGImgFmt.def index 53843e1a..0a2615d1 100644 --- a/build/windows/HGImgFmt/HGImgFmt.def +++ b/build/windows/HGImgFmt/HGImgFmt.def @@ -76,5 +76,6 @@ HGImgFmt_SaveJpegImageToOfdImageWriter HGImgFmt_SaveOfdJpegImage HGImgFmt_CheckPnmFile +HGImgFmt_GetPnmTypeFromFileName HGImgFmt_LoadPnmImage HGImgFmt_SavePnmImage diff --git a/modules/imgfmt/HGImgFmt.cpp b/modules/imgfmt/HGImgFmt.cpp index ade1e195..55d024c9 100644 --- a/modules/imgfmt/HGImgFmt.cpp +++ b/modules/imgfmt/HGImgFmt.cpp @@ -6,6 +6,7 @@ #include "HGPdf.h" #include "HGOfd.h" #include "HGGif.h" +#include "HGPnm.h" #include "../base/HGInc.h" #include @@ -35,7 +36,7 @@ struct HGImgFmtWriterImpl std::string fileName; HGUInt fmtType; HGPointer handle; - HGBool write; // 用于标记JPEG、BMP和PNG是否已经写入 + HGBool write; // 用于标记JPEG、BMP、PNG和PNM是否已经写入 }; HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) @@ -101,6 +102,14 @@ HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType) return HGBASE_ERR_OK; } + HGBool isPnm = HGFALSE; + HGImgFmt_CheckPnmFile(fileName, &isPnm); + if (isPnm) + { + *fmtType = HGIMGFMT_TYPE_PNM; + return HGBASE_ERR_OK; + } + return HGBASE_ERR_FAIL; } @@ -159,6 +168,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_GIF; return HGBASE_ERR_OK; } + + if (0 == _stricmp(p, ".pbm") || 0 == _stricmp(p, ".pgm") || 0 == _stricmp(p, ".ppm") || 0 == _stricmp(p, ".pnm")) + { + *fmtType = HGIMGFMT_TYPE_PNM; + return HGBASE_ERR_OK; + } #else if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg")) { @@ -201,6 +216,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt *fmtType = HGIMGFMT_TYPE_GIF; return HGBASE_ERR_OK; } + + if (0 == strcasecmp(p, ".pbm") || 0 == strcasecmp(p, ".pgm") || 0 == strcasecmp(p, ".ppm") || 0 == strcasecmp(p, ".pnm")) + { + *fmtType = HGIMGFMT_TYPE_PNM; + return HGBASE_ERR_OK; + } #endif return HGBASE_ERR_FAIL; @@ -208,12 +229,13 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti) { - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF || NULL == 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) + if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType || HGIMGFMT_TYPE_PNG == fmtType + || HGIMGFMT_TYPE_PNM == fmtType) *isMulti = HGFALSE; else *isMulti = HGTRUE; @@ -223,7 +245,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_GIF) + if (fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } @@ -393,6 +415,30 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF 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); @@ -526,12 +572,31 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF return HGBASE_ERR_OK; } + HGPnmLoadInfo pnmInfo; + if (HGBASE_ERR_OK == HGImgFmt_LoadPnmImage(fileName, &pnmInfo, imgType, imgOrigin, image)) + { + 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 HGBASE_ERR_FAIL; } HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName) { - if (fmtType > HGIMGFMT_TYPE_GIF) + if (fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } @@ -539,7 +604,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_GIF) + if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_PNM) { return HGBASE_ERR_INVALIDARG; } @@ -642,21 +707,25 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS 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_GIF == fmtType); + assert(HGIMGFMT_TYPE_PNM == fmtType); - return HGImgFmt_SaveGifImage(image, NULL, 50, HG_MAKECOLOR(255, 255, 255, 255), fileName); + return HGImgFmt_SavePnmImage(image, NULL, fileName); } HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, HGImgFmtReader* reader) { - if (NULL == fileName || fmtType > HGIMGFMT_TYPE_GIF || NULL == 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_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) { HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl; imgFmtReaderImpl->fileName = fileName; @@ -820,6 +889,18 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType, return HGBASE_ERR_OK; } + HGBool isPnm = HGFALSE; + 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 HGBASE_ERR_FAIL; } @@ -1053,6 +1134,35 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, 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); @@ -1092,7 +1202,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriter* writer) { - if (fmtType > HGIMGFMT_TYPE_GIF || NULL == writer) + if (fmtType > HGIMGFMT_TYPE_PNM || NULL == writer) { return HGBASE_ERR_INVALIDARG; } @@ -1100,14 +1210,14 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, if (0 == fmtType) { HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType); - if (fmtType < HGIMGFMT_TYPE_JPEG || fmtType > HGIMGFMT_TYPE_GIF) + 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_PNG == fmtType || HGIMGFMT_TYPE_PNM == fmtType) { HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl; imgFmtWriterImpl->fileName = fileName; @@ -1346,6 +1456,21 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, 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); diff --git a/modules/imgfmt/HGImgFmt.h b/modules/imgfmt/HGImgFmt.h index 7ce66991..133b8483 100644 --- a/modules/imgfmt/HGImgFmt.h +++ b/modules/imgfmt/HGImgFmt.h @@ -24,6 +24,8 @@ HG_DECLARE_HANDLE(HGImgFmtWriter); #define HGIMGFMT_TYPE_OFD 6L /* GIF */ #define HGIMGFMT_TYPE_GIF 7L +/* PNM */ +#define HGIMGFMT_TYPE_PNM 8L #pragma pack(push) #pragma pack(4) diff --git a/modules/imgfmt/HGPnm.cpp b/modules/imgfmt/HGPnm.cpp index f0196462..bbc12ba0 100644 --- a/modules/imgfmt/HGPnm.cpp +++ b/modules/imgfmt/HGPnm.cpp @@ -50,6 +50,60 @@ HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm) return HGBASE_ERR_OK; } +HGResult HGAPI HGImgFmt_GetPnmTypeFromFileName(const HGChar* fileName, HGUInt* pnmType) +{ + if (NULL == fileName || NULL == pnmType) + { + return HGBASE_ERR_INVALIDARG; + } + + const char* p = strrchr(fileName, '.'); + if (NULL == p) + { + return HGBASE_ERR_FAIL; + } + +#if defined(HG_CMP_MSC) + if (0 == _stricmp(p, ".pbm")) + { + *pnmType = HGIMGFMT_PNMTYPE_BINARY_BINARY; + return HGBASE_ERR_OK; + } + + if (0 == _stricmp(p, ".pgm")) + { + *pnmType = HGIMGFMT_PNMTYPE_GRAY_BINARY; + return HGBASE_ERR_OK; + } + + if (0 == _stricmp(p, ".ppm")) + { + *pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY; + return HGBASE_ERR_OK; + } +#else + if (0 == strcasecmp(p, ".pbm")) + { + *pnmType = HGIMGFMT_PNMTYPE_BINARY_BINARY; + return HGBASE_ERR_OK; + } + + if (0 == strcasecmp(p, ".pgm")) + { + *pnmType = HGIMGFMT_PNMTYPE_GRAY_BINARY; + return HGBASE_ERR_OK; + } + + if (0 == strcasecmp(p, ".ppm")) + { + *pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY; + return HGBASE_ERR_OK; + } +#endif + + return HGBASE_ERR_FAIL; +} + static HGResult BnmLoadInfo(FILE* file, HGUInt pnmType, HGUInt *width, HGUInt *height, HGUInt *maxColor) { assert(NULL != file && NULL != width && NULL != height && NULL != maxColor); @@ -431,7 +485,7 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info return ret; } -static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) +static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt pnmType) { FILE* file = fopen(fileName, "wb"); if (NULL == file) @@ -445,27 +499,27 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) HGBase_GetImageInfo(image, &imgInfo); char magicKey[4] = {0}; - if (HGIMGFMT_PNMTYPE_BINARY_ASCII == type) + if (HGIMGFMT_PNMTYPE_BINARY_ASCII == pnmType) { strcpy(magicKey, "P1\n"); } - else if (HGIMGFMT_PNMTYPE_GRAY_ASCII == type) + else if (HGIMGFMT_PNMTYPE_GRAY_ASCII == pnmType) { strcpy(magicKey, "P2\n"); } - else if (HGIMGFMT_PNMTYPE_RGB_ASCII == type) + else if (HGIMGFMT_PNMTYPE_RGB_ASCII == pnmType) { strcpy(magicKey, "P3\n"); } - else if (HGIMGFMT_PNMTYPE_BINARY_BINARY == type) + else if (HGIMGFMT_PNMTYPE_BINARY_BINARY == pnmType) { strcpy(magicKey, "P4\n"); } - else if (HGIMGFMT_PNMTYPE_GRAY_BINARY == type) + else if (HGIMGFMT_PNMTYPE_GRAY_BINARY == pnmType) { strcpy(magicKey, "P5\n"); } - else if (HGIMGFMT_PNMTYPE_RGB_BINARY == type) + else if (HGIMGFMT_PNMTYPE_RGB_BINARY == pnmType) { strcpy(magicKey, "P6\n"); } @@ -478,7 +532,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) fwrite(width, 1, strlen(width), file); fwrite(height, 1, strlen(height), file); - if (HGIMGFMT_PNMTYPE_BINARY_ASCII != type && HGIMGFMT_PNMTYPE_BINARY_BINARY != type) + if (HGIMGFMT_PNMTYPE_BINARY_ASCII != pnmType && HGIMGFMT_PNMTYPE_BINARY_BINARY != pnmType) { char maxColor[] = "255\n"; fwrite(maxColor, 1, strlen(maxColor), file); @@ -492,7 +546,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) step = -(HGInt)imgInfo.widthStep; } - if (type == HGIMGFMT_PNMTYPE_BINARY_BINARY) + if (pnmType == HGIMGFMT_PNMTYPE_BINARY_BINARY) { HGUInt lineSize = ((imgInfo.width + 7) & ~7) >> 3; HGByte* buf = (HGByte*)malloc(lineSize); @@ -515,7 +569,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) free(buf); } - else if (type == HGIMGFMT_PNMTYPE_GRAY_BINARY) + else if (pnmType == HGIMGFMT_PNMTYPE_GRAY_BINARY) { for (HGUInt i = 0; i < imgInfo.height; ++i) { @@ -523,7 +577,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) fwrite(pEx, 1, imgInfo.width, file); } } - else if (type == HGIMGFMT_PNMTYPE_RGB_BINARY) + else if (pnmType == HGIMGFMT_PNMTYPE_RGB_BINARY) { for (HGUInt i = 0; i < imgInfo.height; ++i) { @@ -531,10 +585,10 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) fwrite(pEx, 1, imgInfo.width * 3, file); } } - else if (type == HGIMGFMT_PNMTYPE_RGB_ASCII || type == HGIMGFMT_PNMTYPE_GRAY_ASCII || type == HGIMGFMT_PNMTYPE_BINARY_ASCII) + else if (pnmType == HGIMGFMT_PNMTYPE_RGB_ASCII || pnmType == HGIMGFMT_PNMTYPE_GRAY_ASCII || pnmType == HGIMGFMT_PNMTYPE_BINARY_ASCII) { HGUInt w = imgInfo.width; - if (HGIMGFMT_PNMTYPE_RGB_ASCII == type) + if (HGIMGFMT_PNMTYPE_RGB_ASCII == pnmType) w = imgInfo.width * 3; char *buf = (char *)malloc(w * 5 + 1); @@ -560,26 +614,31 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type) uint8_t* pEx = p + (HGSize)i * (HGSize)step; for (HGUInt j = 0; j < w; ++j) { - if (lineSize >= 70) - { - buf[bufLen] = '\n'; - ++bufLen; - lineSize = 0; - } - HGUInt idx; - if (type == HGIMGFMT_PNMTYPE_BINARY_ASCII) + if (pnmType == HGIMGFMT_PNMTYPE_BINARY_ASCII) idx = (0 == GetBit(pEx, j) ? 1 : 0); else idx = pEx[j]; + if (0 != lineSize) + { + if (lineSize + pixelStr[idx].size() + 1 > 70) + { + buf[bufLen] = '\n'; + ++bufLen; + lineSize = 0; + } + else + { + buf[bufLen] = ' '; + ++bufLen; + ++lineSize; + } + } + strcpy(buf + bufLen, pixelStr[idx].c_str()); bufLen += pixelStr[idx].size(); lineSize += pixelStr[idx].size(); - - buf[bufLen] = ' '; - ++bufLen; - ++lineSize; } buf[bufLen] = '\n'; @@ -613,20 +672,35 @@ HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, c HGImageInfo imgInfo; HGBase_GetImageInfo(image, &imgInfo); - if (imgInfo.type == HGBASE_IMGTYPE_BGR || imgInfo.type == HGBASE_IMGTYPE_RGBA || imgInfo.type == HGBASE_IMGTYPE_BGRA) + + HGUInt pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY; + if (HGBASE_IMGTYPE_GRAY == imgInfo.type) + pnmType = HGIMGFMT_PNMTYPE_GRAY_BINARY; + else if (HGBASE_IMGTYPE_BINARY == imgInfo.type) + pnmType = HGIMGFMT_PNMTYPE_BINARY_BINARY; + + if (NULL != info) { - HGUInt imgType = HGBASE_IMGTYPE_RGB; - HGUInt pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY; - - if (NULL != info) + pnmType = info->type; + } + else + { + HGUInt pnmType2 = 0; + HGImgFmt_GetPnmTypeFromFileName(fileName, &pnmType2); + if (0 != pnmType2) { - pnmType = info->type; - if (info->type == HGIMGFMT_PNMTYPE_BINARY_ASCII || info->type == HGIMGFMT_PNMTYPE_BINARY_BINARY) - imgType = HGBASE_IMGTYPE_BINARY; - else if (info->type == HGIMGFMT_PNMTYPE_GRAY_ASCII || info->type == HGIMGFMT_PNMTYPE_GRAY_BINARY) - imgType = HGBASE_IMGTYPE_GRAY; + pnmType = pnmType2; } + } + HGUInt imgType = HGBASE_IMGTYPE_RGB; + if (pnmType == HGIMGFMT_PNMTYPE_BINARY_ASCII || pnmType == HGIMGFMT_PNMTYPE_BINARY_BINARY) + imgType = HGBASE_IMGTYPE_BINARY; + else if (pnmType == HGIMGFMT_PNMTYPE_GRAY_ASCII || pnmType == HGIMGFMT_PNMTYPE_GRAY_BINARY) + imgType = HGBASE_IMGTYPE_GRAY; + + if (imgInfo.type != imgType) + { HGImage image2 = NULL; HGResult ret = HGBase_CloneImage(image, imgType, HGBASE_IMGORIGIN_TOP, &image2); if (ret != HGBASE_ERR_OK) @@ -639,41 +713,5 @@ HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, c return ret; } - HGImage image2 = NULL; - HGUInt pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY; - if (HGBASE_IMGTYPE_GRAY == imgInfo.type) - pnmType = HGIMGFMT_PNMTYPE_GRAY_BINARY; - else if (HGBASE_IMGTYPE_BINARY == imgInfo.type) - pnmType = HGIMGFMT_PNMTYPE_BINARY_BINARY; - - if (NULL != info) - { - HGUInt imgType = imgInfo.type; - pnmType = info->type; - - if (info->type == HGIMGFMT_PNMTYPE_BINARY_ASCII || info->type == HGIMGFMT_PNMTYPE_BINARY_BINARY) - imgType = HGBASE_IMGTYPE_BINARY; - else if (info->type == HGIMGFMT_PNMTYPE_GRAY_ASCII || info->type == HGIMGFMT_PNMTYPE_GRAY_BINARY) - imgType = HGBASE_IMGTYPE_GRAY; - else if (info->type == HGIMGFMT_PNMTYPE_RGB_ASCII || info->type == HGIMGFMT_PNMTYPE_RGB_BINARY) - imgType = HGBASE_IMGTYPE_RGB; - - if (imgInfo.type != imgType) - { - HGResult ret = HGBase_CloneImage(image, imgType, HGBASE_IMGORIGIN_TOP, &image2); - if (ret != HGBASE_ERR_OK) - { - return ret; - } - } - } - - if (NULL != image2) - { - HGResult ret = BnmSaveImage(image2, fileName, pnmType); - HGBase_DestroyImage(image2); - return ret; - } - return BnmSaveImage(image, fileName, pnmType); } diff --git a/modules/imgfmt/HGPnm.h b/modules/imgfmt/HGPnm.h index 426e391b..ee393e66 100644 --- a/modules/imgfmt/HGPnm.h +++ b/modules/imgfmt/HGPnm.h @@ -33,6 +33,8 @@ typedef struct HGEXPORT HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm); +HGEXPORT HGResult HGAPI HGImgFmt_GetPnmTypeFromFileName(const HGChar* fileName, HGUInt* pnmType); + HGEXPORT HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image);