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_SaveJpegImageToOfdImageWriter
HGImgFmt_SaveOfdJpegImage
HGImgFmt_CheckPnmFile
HGImgFmt_LoadPnmImage
HGImgFmt_SavePnmImage

View File

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

View File

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

View File

@ -71,7 +71,7 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
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;
}
@ -194,6 +194,11 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
}
}
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
HGImageInfo bmpImageInfo;
bmpImageInfo.width = bmp.width;
bmpImageInfo.height = bmp.height;

View File

@ -648,7 +648,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index,
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;
}
@ -664,6 +664,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromGifReader(HGGifReader reader, HGUInt index,
imgType = HGBASE_IMGTYPE_RGB;
}
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
if (index < gifReaderImpl->m_curIndex)
{
gifReaderImpl->m_curIndex = 0xFFFFFFFF;

View File

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

View File

@ -293,7 +293,7 @@ HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
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;
}

View File

@ -185,7 +185,7 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
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;
}
@ -210,6 +210,9 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
if (0 == imgType)
imgType = HGBASE_IMGTYPE_RGB;
if (imgOrigin == 0)
imgOrigin = HGBASE_IMGORIGIN_TOP;
HGImage image2 = NULL;
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))

View File

@ -42,7 +42,7 @@ HGResult HGAPI HGImgFmt_LoadPngImage(const HGChar* fileName, HGPngLoadInfo* info
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;
}
@ -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))
{
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 <vector>
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;
}
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;
HGInt rgbMaxColor, width, height;
assert(NULL != file && NULL != width && NULL != height && NULL != maxColor);
c = getc(&file);
while (c == '#')
{
while (getc(&file) != '\n');
c = getc(&file);
}
ungetc(c, &file);
bool getWidth = false;
bool getHeight = false;
bool getMaxColor = false;
std::vector<char> buf;
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
while (1)
{
c = fgetc(&file);
while (c == '#')
HGByte c = 0;
if (1 != fread(&c, 1, 1, file))
{
while (getc(&file) != '\n');
c = getc(&file);
return HGBASE_ERR_INVALIDDATA;
}
}
ungetc(c, &file);
fscanf(&file, "%d", &width);
c = getc(&file);
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
c = fgetc(&file);
while (c == '#')
if (c == '#' || c == '\n' || c == '\r' || c == '\t' || c == ' ')
{
while (getc(&file) != '\n');
c = getc(&file);
if (!buf.empty())
{
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);
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)
if (NULL != info)
{
info->width = width;
info->height = height;
info->type = HGIMGFMT_PNMTYPE_RGB_BINRAY;
}
if (image != NULL)
if (NULL != image)
{
if (imgType == 0)
{
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;
HGBase_GetImageData(image2, &data);
HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo);
memcpy(data, buffer, dataSize);
if(HGBASE_ERR_OK != HGBase_CloneImage(image2, imgType, imgOrigin, image))
HGByte* buf = new HGByte[width * 3];
for (HGUInt i = 0; i < height; ++i)
{
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;
}
@ -184,7 +182,7 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info
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;
}
@ -196,42 +194,20 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info
return HGBASE_ERR_ACCESSDENIED;
}
HGChar header[1024] = {0};
HGChar c = NULL;
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')
HGByte magicKey[2] = {0};
if (2 != fread(magicKey, 1, 2, file))
{
return HGBASE_ERR_INVALIDDATA;
}
else
{
c = getc(file);
if (c < '1' || c > '6')
{
return HGBASE_ERR_INVALIDDATA;
}
if (c == '6')
{
bnm_load_P6(*file, info, imgType, imgOrigin, image);
}
HGResult ret = HGBASE_ERR_INVALIDDATA;
if (magicKey[0] == 'P' && magicKey[1] == '6')
{
ret = BnmLoadP6Image(file, info, imgType, imgOrigin, image);
}
fclose(file);
return ret;
}
HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName)

View File

@ -1,5 +1,5 @@
#ifndef __HGPnm_H__
#define __HGPnm_H__
#ifndef __HGPNM_H__
#define __HGPNM_H__
#include "../base/HGDef.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);
#endif // __HGPnm_H__
#endif // __HGPNM_H__

View File

@ -85,7 +85,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
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;
}
@ -158,6 +158,11 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
}
}
if (imgOrigin == 0)
{
imgOrigin = HGBASE_IMGORIGIN_TOP;
}
HGImageInfo tiffImageInfo;
tiffImageInfo.width = width;
tiffImageInfo.height = height;