ppm格式库调整,考虑文件大小不规范的情况

This commit is contained in:
luoliangyi 2022-10-28 10:53:54 +08:00
parent ec756ddc0f
commit 045ad3fb72
12 changed files with 167 additions and 151 deletions

View File

@ -74,3 +74,7 @@ HGImgFmt_OpenOfdImageWriter
HGImgFmt_CloseOfdImageWriter HGImgFmt_CloseOfdImageWriter
HGImgFmt_SaveJpegImageToOfdImageWriter HGImgFmt_SaveJpegImageToOfdImageWriter
HGImgFmt_SaveOfdJpegImage HGImgFmt_SaveOfdJpegImage
HGImgFmt_CheckPnmFile
HGImgFmt_LoadPnmImage
HGImgFmt_SavePnmImage

View File

@ -47,6 +47,7 @@
<ClCompile Include="..\..\..\modules\imgfmt\HGPdf.cpp" /> <ClCompile Include="..\..\..\modules\imgfmt\HGPdf.cpp" />
<ClCompile Include="..\..\..\modules\imgfmt\HGPdfImpl.cpp" /> <ClCompile Include="..\..\..\modules\imgfmt\HGPdfImpl.cpp" />
<ClCompile Include="..\..\..\modules\imgfmt\HGPng.cpp" /> <ClCompile Include="..\..\..\modules\imgfmt\HGPng.cpp" />
<ClCompile Include="..\..\..\modules\imgfmt\HGPnm.cpp" />
<ClCompile Include="..\..\..\modules\imgfmt\HGTiff.cpp" /> <ClCompile Include="..\..\..\modules\imgfmt\HGTiff.cpp" />
<ClCompile Include="..\..\..\utility\HGString.cpp" /> <ClCompile Include="..\..\..\utility\HGString.cpp" />
</ItemGroup> </ItemGroup>
@ -61,6 +62,7 @@
<ClInclude Include="..\..\..\modules\imgfmt\HGPdf.h" /> <ClInclude Include="..\..\..\modules\imgfmt\HGPdf.h" />
<ClInclude Include="..\..\..\modules\imgfmt\HGPdfImpl.hpp" /> <ClInclude Include="..\..\..\modules\imgfmt\HGPdfImpl.hpp" />
<ClInclude Include="..\..\..\modules\imgfmt\HGPng.h" /> <ClInclude Include="..\..\..\modules\imgfmt\HGPng.h" />
<ClInclude Include="..\..\..\modules\imgfmt\HGPnm.h" />
<ClInclude Include="..\..\..\modules\imgfmt\HGTiff.h" /> <ClInclude Include="..\..\..\modules\imgfmt\HGTiff.h" />
<ClInclude Include="..\..\..\utility\HGString.h" /> <ClInclude Include="..\..\..\utility\HGString.h" />
</ItemGroup> </ItemGroup>

View File

@ -18,6 +18,7 @@
#include "imgfmt/HGGif.h" #include "imgfmt/HGGif.h"
#include "imgfmt/HGPdf.h" #include "imgfmt/HGPdf.h"
#include "imgfmt/HGOfd.h" #include "imgfmt/HGOfd.h"
#include "imgfmt/HGPnm.h"
#include "imgfmt/HGImgFmt.h" #include "imgfmt/HGImgFmt.h"
#include "imgproc/HGImgProc.h" #include "imgproc/HGImgProc.h"
#include "imgproc/HGOCR.h" #include "imgproc/HGOCR.h"

View File

@ -71,7 +71,7 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -194,6 +194,11 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
} }
} }
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
HGImageInfo bmpImageInfo; HGImageInfo bmpImageInfo;
bmpImageInfo.width = bmp.width; bmpImageInfo.width = bmp.width;
bmpImageInfo.height = bmp.height; bmpImageInfo.height = bmp.height;

View File

@ -648,7 +648,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index,
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -664,6 +664,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index,
imgType = HGBASE_IMGTYPE_RGB; imgType = HGBASE_IMGTYPE_RGB;
} }
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
if (index < gifReaderImpl->m_curIndex) if (index < gifReaderImpl->m_curIndex)
{ {
gifReaderImpl->m_curIndex = 0xFFFFFFFF; gifReaderImpl->m_curIndex = 0xFFFFFFFF;

View File

@ -57,7 +57,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -112,6 +112,11 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in
imgType = HGBASE_IMGTYPE_GRAY; imgType = HGBASE_IMGTYPE_GRAY;
} }
if (0 == imgOrigin)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
cinfo.out_color_space = JCS_RGB; cinfo.out_color_space = JCS_RGB;
jpeg_start_decompress(&cinfo); jpeg_start_decompress(&cinfo);
@ -183,7 +188,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo*
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -235,6 +240,11 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo*
imgType = HGBASE_IMGTYPE_GRAY; imgType = HGBASE_IMGTYPE_GRAY;
} }
if (0 == imgOrigin)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
cinfo.out_color_space = JCS_RGB; cinfo.out_color_space = JCS_RGB;
jpeg_start_decompress(&cinfo); jpeg_start_decompress(&cinfo);

View File

@ -293,7 +293,7 @@ HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }

View File

@ -185,7 +185,7 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -210,6 +210,9 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
if (0 == imgType) if (0 == imgType)
imgType = HGBASE_IMGTYPE_RGB; imgType = HGBASE_IMGTYPE_RGB;
if (imgOrigin == 0)
imgOrigin = HGBASE_IMGORIGIN_TOP;
HGImage image2 = NULL; HGImage image2 = NULL;
HGImageInfo imgInfo = { (uint32_t)width, (uint32_t)height, HGBASE_IMGTYPE_RGB, (uint32_t)pix->stride, HGBASE_IMGORIGIN_TOP }; HGImageInfo imgInfo = { (uint32_t)width, (uint32_t)height, HGBASE_IMGTYPE_RGB, (uint32_t)pix->stride, HGBASE_IMGORIGIN_TOP };
if (HGBASE_ERR_OK == HGBase_CreateImageWithData(pix->samples, &imgInfo, &image2)) if (HGBASE_ERR_OK == HGBase_CreateImageWithData(pix->samples, &imgInfo, &image2))

View File

@ -42,7 +42,7 @@ HGResult HGAPI HGImgFmt_LoadPngImage(const HGChar* fileName, HGPngLoadInfo* info
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -171,6 +171,11 @@ HGResult HGAPI HGImgFmt_LoadPngImage(const HGChar* fileName, HGPngLoadInfo* info
} }
} }
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
if (HGBASE_ERR_OK != HGBase_CreateImage(info_ptr->width, info_ptr->height, HGBASE_IMGTYPE_RGBA, HGBASE_IMGORIGIN_TOP, &image2)) if (HGBASE_ERR_OK != HGBase_CreateImage(info_ptr->width, info_ptr->height, HGBASE_IMGTYPE_RGBA, HGBASE_IMGORIGIN_TOP, &image2))
{ {
longjmp(png_jmpbuf(png_ptr), (int)HGBASE_ERR_FAIL); longjmp(png_jmpbuf(png_ptr), (int)HGBASE_ERR_FAIL);

View File

@ -1,5 +1,6 @@
#include "HGPnm.h" #include "HGPnm.h"
#include "../base/HGInc.h" #include "../base/HGInc.h"
#include <vector>
HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm) HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm)
{ {
@ -14,149 +15,146 @@ HGResult HGAPI HGImgFmt_CheckPnmFile(const HGChar* fileName, HGBool* isPnm)
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
static HGResult bnm_load_P6(FILE &file, HGPnmLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image) static HGResult BnmLoadP6Info(FILE* file, HGUInt *width, HGUInt *height, HGUInt *maxColor)
{ {
HGChar c; assert(NULL != file && NULL != width && NULL != height && NULL != maxColor);
HGInt rgbMaxColor, width, height;
c = getc(&file); bool getWidth = false;
while (c == '#') bool getHeight = false;
{ bool getMaxColor = false;
while (getc(&file) != '\n'); std::vector<char> buf;
c = getc(&file);
}
ungetc(c, &file);
while (c == '\n' || c == '\r' || c == '\t' || c == ' ') while (1)
{ {
c = fgetc(&file); HGByte c = 0;
while (c == '#') if (1 != fread(&c, 1, 1, file))
{ {
while (getc(&file) != '\n'); return HGBASE_ERR_INVALIDDATA;
c = getc(&file);
} }
}
ungetc(c, &file);
fscanf(&file, "%d", &width); if (c == '#' || c == '\n' || c == '\r' || c == '\t' || c == ' ')
c = getc(&file);
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
c = fgetc(&file);
while (c == '#')
{ {
while (getc(&file) != '\n'); if (!buf.empty())
c = getc(&file); {
buf.push_back(0);
if (!getWidth)
{
*width = atoi(&buf[0]);
if (*width == 0)
return HGBASE_ERR_INVALIDDATA;
getWidth = true;
}
else if (!getHeight)
{
*height = atoi(&buf[0]);
if (*height == 0)
return HGBASE_ERR_INVALIDDATA;
getHeight = true;
}
else if (!getMaxColor)
{
*maxColor = atoi(&buf[0]);
if (*maxColor == 0)
return HGBASE_ERR_INVALIDDATA;
getMaxColor = true;
}
buf.clear();
}
if (c == '#')
{
while (c != '\n')
{
if (1 != fread(&c, 1, 1, file))
{
return HGBASE_ERR_INVALIDDATA;
}
}
}
}
else if (c >= '0' && c <= '9')
{
buf.push_back(c);
}
else
{
return HGBASE_ERR_INVALIDDATA;
}
if (getMaxColor)
{
break;
} }
} }
ungetc(c, &file);
fscanf(&file, "%d", &height);
if (width <= 0 || height <= 0) return HGBASE_ERR_OK;
}
static HGResult BnmLoadP6Image(FILE* file, HGPnmLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image)
{
HGUInt width, height, maxColor;
HGResult ret = BnmLoadP6Info(file , &width, &height, &maxColor);
if (HGBASE_ERR_OK != ret || 255 != maxColor)
{ {
return HGBASE_ERR_INVALIDARG; return ret;
} }
c = getc(&file); if (NULL != info)
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
c = fgetc(&file);
while (c == '#')
{
while (getc(&file) != '\n');
c = getc(&file);
}
}
ungetc(c, &file);
fscanf(&file, "%d", &rgbMaxColor);
if (rgbMaxColor <= 0)
{
return HGBASE_ERR_INVALIDARG;
}
c = fgetc(&file);
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
c = fgetc(&file);
while (c == '#')
{
while (getc(&file) != '\n');
c = getc(&file);
}
}
ungetc(c, &file);
_fseeki64(&file, 0, SEEK_CUR);
uint64_t headerSize = _ftelli64(&file);
_fseeki64(&file, 0, SEEK_END);
uint64_t totalSize = _ftelli64(&file);
if (0 == headerSize || 0 == totalSize)
{
fclose(&file);
return HGBASE_ERR_FAIL;
}
size_t dataSize = (size_t)totalSize - (size_t)headerSize;
uint8_t* buffer = (uint8_t*)malloc(dataSize);
if (NULL == buffer)
{
fclose(&file);
return HGBASE_ERR_FAIL;
}
_fseeki64(&file, headerSize, SEEK_SET);
size_t readSize = fread(buffer, 1, dataSize, &file);
if (readSize != dataSize || dataSize != (size_t)width * (size_t)height * 3)
{
free(buffer);
buffer = NULL;
fclose(&file);
return HGBASE_ERR_FAIL;
}
HGImage image2 = NULL;
if (info != NULL)
{ {
info->width = width; info->width = width;
info->height = height; info->height = height;
info->type = HGIMGFMT_PNMTYPE_RGB_BINRAY; info->type = HGIMGFMT_PNMTYPE_RGB_BINRAY;
} }
if (image != NULL) if (NULL != image)
{ {
if (imgType == 0) if (imgType == 0)
{ {
imgType = HGBASE_IMGTYPE_RGB; imgType = HGBASE_IMGTYPE_RGB;
} }
HGBase_CreateImage(width, height, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &image2); if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
HGImage image2 = NULL;
ret = HGBase_CreateImage(width, height, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &image2);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
uint8_t* data; uint8_t* data;
HGBase_GetImageData(image2, &data); HGBase_GetImageData(image2, &data);
HGImageInfo imgInfo; HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo); HGBase_GetImageInfo(image2, &imgInfo);
memcpy(data, buffer, dataSize); HGByte* buf = new HGByte[width * 3];
for (HGUInt i = 0; i < height; ++i)
if(HGBASE_ERR_OK != HGBase_CloneImage(image2, imgType, imgOrigin, image))
{ {
return HGBASE_ERR_FAIL; if (width * 3 != fread(buf, 1, width * 3, file))
{
delete[] buf;
HGBase_DestroyImage(image2);
return HGBASE_ERR_INVALIDDATA;
}
memcpy(data + i * imgInfo.widthStep, buf, width * 3);
}
delete[] buf;
ret = HGBase_CloneImage(image2, imgType, imgOrigin, image);
HGBase_DestroyImage(image2);
if (HGBASE_ERR_OK != ret)
{
return ret;
} }
} }
HGBase_DestroyImage(image2);
image2 = NULL;
free(buffer);
buffer = NULL;
fclose(&file);
return HGBASE_ERR_OK; return HGBASE_ERR_OK;
} }
@ -184,7 +182,7 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -196,42 +194,20 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info
return HGBASE_ERR_ACCESSDENIED; return HGBASE_ERR_ACCESSDENIED;
} }
HGChar header[1024] = {0}; HGByte magicKey[2] = {0};
HGChar c = NULL; if (2 != fread(magicKey, 1, 2, file))
c = getc(file);
while (c == '#')
{
while (getc(file) != '\n');
c = getc(file);
}
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
c = getc(file);
while (c == '#')
{
while (getc(file) != '\n');
c = getc(file);
}
}
if (c != 'P')
{ {
return HGBASE_ERR_INVALIDDATA; return HGBASE_ERR_INVALIDDATA;
} }
else
{
c = getc(file);
if (c < '1' || c > '6')
{
return HGBASE_ERR_INVALIDDATA;
}
if (c == '6') HGResult ret = HGBASE_ERR_INVALIDDATA;
{ if (magicKey[0] == 'P' && magicKey[1] == '6')
bnm_load_P6(*file, info, imgType, imgOrigin, image); {
} ret = BnmLoadP6Image(file, info, imgType, imgOrigin, image);
} }
fclose(file);
return ret;
} }
HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName) HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName)

View File

@ -1,5 +1,5 @@
#ifndef __HGPnm_H__ #ifndef __HGPNM_H__
#define __HGPnm_H__ #define __HGPNM_H__
#include "../base/HGDef.h" #include "../base/HGDef.h"
#include "../base/HGBaseErr.h" #include "../base/HGBaseErr.h"
@ -38,4 +38,4 @@ HGEXPORT HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadI
HGEXPORT HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName); HGEXPORT HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName);
#endif // __HGPnm_H__ #endif // __HGPNM_H__

View File

@ -85,7 +85,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin) if (0 != imgOrigin && HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{ {
return HGBASE_ERR_INVALIDARG; return HGBASE_ERR_INVALIDARG;
} }
@ -158,6 +158,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
} }
} }
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
HGImageInfo tiffImageInfo; HGImageInfo tiffImageInfo;
tiffImageInfo.width = width; tiffImageInfo.width = width;
tiffImageInfo.height = height; tiffImageInfo.height = height;