将pnm集成到hgimgfmt中
This commit is contained in:
parent
89598f053c
commit
6c9016eab0
|
@ -76,5 +76,6 @@ HGImgFmt_SaveJpegImageToOfdImageWriter
|
||||||
HGImgFmt_SaveOfdJpegImage
|
HGImgFmt_SaveOfdJpegImage
|
||||||
|
|
||||||
HGImgFmt_CheckPnmFile
|
HGImgFmt_CheckPnmFile
|
||||||
|
HGImgFmt_GetPnmTypeFromFileName
|
||||||
HGImgFmt_LoadPnmImage
|
HGImgFmt_LoadPnmImage
|
||||||
HGImgFmt_SavePnmImage
|
HGImgFmt_SavePnmImage
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "HGPdf.h"
|
#include "HGPdf.h"
|
||||||
#include "HGOfd.h"
|
#include "HGOfd.h"
|
||||||
#include "HGGif.h"
|
#include "HGGif.h"
|
||||||
|
#include "HGPnm.h"
|
||||||
#include "../base/HGInc.h"
|
#include "../base/HGInc.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ struct HGImgFmtWriterImpl
|
||||||
std::string fileName;
|
std::string fileName;
|
||||||
HGUInt fmtType;
|
HGUInt fmtType;
|
||||||
HGPointer handle;
|
HGPointer handle;
|
||||||
HGBool write; // 用于标记JPEG、BMP和PNG是否已经写入
|
HGBool write; // 用于标记JPEG、BMP、PNG和PNM是否已经写入
|
||||||
};
|
};
|
||||||
|
|
||||||
HGResult HGAPI HGImgFmt_GetImgFmtType(const HGChar* fileName, HGUInt* fmtType)
|
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;
|
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;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,6 +168,12 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
|
||||||
*fmtType = HGIMGFMT_TYPE_GIF;
|
*fmtType = HGIMGFMT_TYPE_GIF;
|
||||||
return HGBASE_ERR_OK;
|
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
|
#else
|
||||||
if (0 == strcasecmp(p, ".jpe") || 0 == strcasecmp(p, ".jpg") || 0 == strcasecmp(p, ".jpeg"))
|
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;
|
*fmtType = HGIMGFMT_TYPE_GIF;
|
||||||
return HGBASE_ERR_OK;
|
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
|
#endif
|
||||||
|
|
||||||
return HGBASE_ERR_FAIL;
|
return HGBASE_ERR_FAIL;
|
||||||
|
@ -208,12 +229,13 @@ HGResult HGAPI HGImgFmt_GetImgFmtTypeFromFileName(const HGChar* fileName, HGUInt
|
||||||
|
|
||||||
HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isMulti)
|
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;
|
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;
|
*isMulti = HGFALSE;
|
||||||
else
|
else
|
||||||
*isMulti = HGTRUE;
|
*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,
|
HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info,
|
||||||
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
||||||
{
|
{
|
||||||
if (fmtType > HGIMGFMT_TYPE_GIF)
|
if (fmtType > HGIMGFMT_TYPE_PNM)
|
||||||
{
|
{
|
||||||
return HGBASE_ERR_INVALIDARG;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -393,6 +415,30 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
|
||||||
|
|
||||||
return HGBASE_ERR_OK;
|
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);
|
assert(0 == fmtType);
|
||||||
|
|
||||||
|
@ -526,12 +572,31 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
|
||||||
return HGBASE_ERR_OK;
|
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;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -539,7 +604,7 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS
|
||||||
if (0 == fmtType)
|
if (0 == fmtType)
|
||||||
{
|
{
|
||||||
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -642,21 +707,25 @@ HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtS
|
||||||
|
|
||||||
return HGImgFmt_SaveOfdJpegImage(image, pJpegInfo, fileName);
|
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)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType
|
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;
|
HGImgFmtReaderImpl* imgFmtReaderImpl = new HGImgFmtReaderImpl;
|
||||||
imgFmtReaderImpl->fileName = fileName;
|
imgFmtReaderImpl->fileName = fileName;
|
||||||
|
@ -820,6 +889,18 @@ HGResult HGAPI HGImgFmt_OpenImageReader(const HGChar* fileName, HGUInt fmtType,
|
||||||
return HGBASE_ERR_OK;
|
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;
|
return HGBASE_ERR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,6 +1134,35 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index,
|
||||||
|
|
||||||
return ret;
|
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);
|
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)
|
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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
@ -1100,14 +1210,14 @@ HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType,
|
||||||
if (0 == fmtType)
|
if (0 == fmtType)
|
||||||
{
|
{
|
||||||
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &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;
|
return HGBASE_ERR_INVALIDARG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HGIMGFMT_TYPE_JPEG == fmtType || HGIMGFMT_TYPE_BMP == fmtType
|
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;
|
HGImgFmtWriterImpl* imgFmtWriterImpl = new HGImgFmtWriterImpl;
|
||||||
imgFmtWriterImpl->fileName = fileName;
|
imgFmtWriterImpl->fileName = fileName;
|
||||||
|
@ -1346,6 +1456,21 @@ HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image,
|
||||||
|
|
||||||
return HGImgFmt_SaveJpegImageToOfdImageWriter((HGOfdImageWriter)imgFmtWriterImpl->handle, image, pJpegInfo);
|
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);
|
assert(HGIMGFMT_TYPE_GIF == imgFmtWriterImpl->fmtType);
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ HG_DECLARE_HANDLE(HGImgFmtWriter);
|
||||||
#define HGIMGFMT_TYPE_OFD 6L
|
#define HGIMGFMT_TYPE_OFD 6L
|
||||||
/* GIF */
|
/* GIF */
|
||||||
#define HGIMGFMT_TYPE_GIF 7L
|
#define HGIMGFMT_TYPE_GIF 7L
|
||||||
|
/* PNM */
|
||||||
|
#define HGIMGFMT_TYPE_PNM 8L
|
||||||
|
|
||||||
#pragma pack(push)
|
#pragma pack(push)
|
||||||
#pragma pack(4)
|
#pragma pack(4)
|
||||||
|
|
|
@ -50,6 +50,60 @@ HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm)
|
||||||
return HGBASE_ERR_OK;
|
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)
|
static HGResult BnmLoadInfo(FILE* file, HGUInt pnmType, HGUInt *width, HGUInt *height, HGUInt *maxColor)
|
||||||
{
|
{
|
||||||
assert(NULL != file && NULL != width && NULL != height && NULL != 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;
|
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");
|
FILE* file = fopen(fileName, "wb");
|
||||||
if (NULL == file)
|
if (NULL == file)
|
||||||
|
@ -445,27 +499,27 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type)
|
||||||
HGBase_GetImageInfo(image, &imgInfo);
|
HGBase_GetImageInfo(image, &imgInfo);
|
||||||
|
|
||||||
char magicKey[4] = {0};
|
char magicKey[4] = {0};
|
||||||
if (HGIMGFMT_PNMTYPE_BINARY_ASCII == type)
|
if (HGIMGFMT_PNMTYPE_BINARY_ASCII == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P1\n");
|
strcpy(magicKey, "P1\n");
|
||||||
}
|
}
|
||||||
else if (HGIMGFMT_PNMTYPE_GRAY_ASCII == type)
|
else if (HGIMGFMT_PNMTYPE_GRAY_ASCII == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P2\n");
|
strcpy(magicKey, "P2\n");
|
||||||
}
|
}
|
||||||
else if (HGIMGFMT_PNMTYPE_RGB_ASCII == type)
|
else if (HGIMGFMT_PNMTYPE_RGB_ASCII == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P3\n");
|
strcpy(magicKey, "P3\n");
|
||||||
}
|
}
|
||||||
else if (HGIMGFMT_PNMTYPE_BINARY_BINARY == type)
|
else if (HGIMGFMT_PNMTYPE_BINARY_BINARY == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P4\n");
|
strcpy(magicKey, "P4\n");
|
||||||
}
|
}
|
||||||
else if (HGIMGFMT_PNMTYPE_GRAY_BINARY == type)
|
else if (HGIMGFMT_PNMTYPE_GRAY_BINARY == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P5\n");
|
strcpy(magicKey, "P5\n");
|
||||||
}
|
}
|
||||||
else if (HGIMGFMT_PNMTYPE_RGB_BINARY == type)
|
else if (HGIMGFMT_PNMTYPE_RGB_BINARY == pnmType)
|
||||||
{
|
{
|
||||||
strcpy(magicKey, "P6\n");
|
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(width, 1, strlen(width), file);
|
||||||
fwrite(height, 1, strlen(height), 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";
|
char maxColor[] = "255\n";
|
||||||
fwrite(maxColor, 1, strlen(maxColor), file);
|
fwrite(maxColor, 1, strlen(maxColor), file);
|
||||||
|
@ -492,7 +546,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type)
|
||||||
step = -(HGInt)imgInfo.widthStep;
|
step = -(HGInt)imgInfo.widthStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == HGIMGFMT_PNMTYPE_BINARY_BINARY)
|
if (pnmType == HGIMGFMT_PNMTYPE_BINARY_BINARY)
|
||||||
{
|
{
|
||||||
HGUInt lineSize = ((imgInfo.width + 7) & ~7) >> 3;
|
HGUInt lineSize = ((imgInfo.width + 7) & ~7) >> 3;
|
||||||
HGByte* buf = (HGByte*)malloc(lineSize);
|
HGByte* buf = (HGByte*)malloc(lineSize);
|
||||||
|
@ -515,7 +569,7 @@ static HGResult BnmSaveImage(HGImage image, const HGChar* fileName, HGUInt type)
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
else if (type == HGIMGFMT_PNMTYPE_GRAY_BINARY)
|
else if (pnmType == HGIMGFMT_PNMTYPE_GRAY_BINARY)
|
||||||
{
|
{
|
||||||
for (HGUInt i = 0; i < imgInfo.height; ++i)
|
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);
|
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)
|
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);
|
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;
|
HGUInt w = imgInfo.width;
|
||||||
if (HGIMGFMT_PNMTYPE_RGB_ASCII == type)
|
if (HGIMGFMT_PNMTYPE_RGB_ASCII == pnmType)
|
||||||
w = imgInfo.width * 3;
|
w = imgInfo.width * 3;
|
||||||
|
|
||||||
char *buf = (char *)malloc(w * 5 + 1);
|
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;
|
uint8_t* pEx = p + (HGSize)i * (HGSize)step;
|
||||||
for (HGUInt j = 0; j < w; ++j)
|
for (HGUInt j = 0; j < w; ++j)
|
||||||
{
|
{
|
||||||
if (lineSize >= 70)
|
|
||||||
{
|
|
||||||
buf[bufLen] = '\n';
|
|
||||||
++bufLen;
|
|
||||||
lineSize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
HGUInt idx;
|
HGUInt idx;
|
||||||
if (type == HGIMGFMT_PNMTYPE_BINARY_ASCII)
|
if (pnmType == HGIMGFMT_PNMTYPE_BINARY_ASCII)
|
||||||
idx = (0 == GetBit(pEx, j) ? 1 : 0);
|
idx = (0 == GetBit(pEx, j) ? 1 : 0);
|
||||||
else
|
else
|
||||||
idx = pEx[j];
|
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());
|
strcpy(buf + bufLen, pixelStr[idx].c_str());
|
||||||
bufLen += pixelStr[idx].size();
|
bufLen += pixelStr[idx].size();
|
||||||
lineSize += pixelStr[idx].size();
|
lineSize += pixelStr[idx].size();
|
||||||
|
|
||||||
buf[bufLen] = ' ';
|
|
||||||
++bufLen;
|
|
||||||
++lineSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buf[bufLen] = '\n';
|
buf[bufLen] = '\n';
|
||||||
|
@ -613,20 +672,35 @@ HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, c
|
||||||
|
|
||||||
HGImageInfo imgInfo;
|
HGImageInfo imgInfo;
|
||||||
HGBase_GetImageInfo(image, &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;
|
pnmType = info->type;
|
||||||
HGUInt pnmType = HGIMGFMT_PNMTYPE_RGB_BINARY;
|
}
|
||||||
|
else
|
||||||
if (NULL != info)
|
{
|
||||||
|
HGUInt pnmType2 = 0;
|
||||||
|
HGImgFmt_GetPnmTypeFromFileName(fileName, &pnmType2);
|
||||||
|
if (0 != pnmType2)
|
||||||
{
|
{
|
||||||
pnmType = info->type;
|
pnmType = pnmType2;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
HGImage image2 = NULL;
|
||||||
HGResult ret = HGBase_CloneImage(image, imgType, HGBASE_IMGORIGIN_TOP, &image2);
|
HGResult ret = HGBase_CloneImage(image, imgType, HGBASE_IMGORIGIN_TOP, &image2);
|
||||||
if (ret != HGBASE_ERR_OK)
|
if (ret != HGBASE_ERR_OK)
|
||||||
|
@ -639,41 +713,5 @@ HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, c
|
||||||
return ret;
|
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);
|
return BnmSaveImage(image, fileName, pnmType);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ typedef struct
|
||||||
|
|
||||||
HGEXPORT HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm);
|
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,
|
HGEXPORT HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info,
|
||||||
HGUInt imgType, HGUInt imgOrigin, HGImage* image);
|
HGUInt imgType, HGUInt imgOrigin, HGImage* image);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue