diff --git a/build/windows/HGTest/HGTestDlg.cpp b/build/windows/HGTest/HGTestDlg.cpp index 1760c8d0..61cc378c 100644 --- a/build/windows/HGTest/HGTestDlg.cpp +++ b/build/windows/HGTest/HGTestDlg.cpp @@ -104,10 +104,6 @@ BOOL CHGTestDlg::OnInitDialog() SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 - HGImage image = NULL; - HGImgFmt_LoadPnmImage("D:\\rgb.ppm", NULL, 0, 0, &image); - HGImgFmt_SaveImage(image, 0, NULL, "D:\\kkk.jpg"); - HGTwain_LoadDSM(&m_dsm); HGTwain_OpenDSM(m_dsm, m_hWnd, DSEventCallback, this); diff --git a/modules/imgfmt/HGPnm.cpp b/modules/imgfmt/HGPnm.cpp index 8a44bd4e..18e284e5 100644 --- a/modules/imgfmt/HGPnm.cpp +++ b/modules/imgfmt/HGPnm.cpp @@ -210,7 +210,72 @@ HGResult HGAPI HGImgFmt_LoadPnmImage(const HGChar* fileName, HGPnmLoadInfo* info return ret; } -HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName) +static HGResult BnmSaveP6Image(HGImage image, const HGChar* fileName) { + HGImageInfo imgInfo; + HGBase_GetImageInfo(image, &imgInfo); + assert(imgInfo.type == HGBASE_IMGTYPE_RGB); + + FILE* file = fopen(fileName, "wb"); + if (NULL == file) + { + return HGBASE_ERR_ACCESSDENIED; + } + + HGByte* data = NULL; + HGBase_GetImageData(image, &data); + + char magicKey[] = "P6\n"; + fwrite(magicKey, 1, strlen(magicKey), file); + + char width[20], height[20]; + sprintf(width, "%u\n", imgInfo.width); + sprintf(height, "%u\n", imgInfo.height); + fwrite(width, 1, strlen(width), file); + fwrite(height, 1, strlen(height), file); + + char maxColor[] = "255\n"; + fwrite(maxColor, 1, strlen(maxColor), file); + + HGByte* p = data; + HGInt step = (HGInt)imgInfo.widthStep; + if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin) + { + p = data + (imgInfo.height - 1) * imgInfo.widthStep; + step = -(HGInt)imgInfo.widthStep; + } + + for (HGUInt i = 0; i < imgInfo.height; ++i) + { + uint8_t* pEx = p + (HGSize)i * (HGSize)step; + fwrite(pEx, 1, imgInfo.width * 3, file); + } + + fclose(file); return HGBASE_ERR_OK; } + +HGResult HGAPI HGImgFmt_SavePnmImage(HGImage image, const HGPnmSaveInfo* info, const HGChar* fileName) +{ + if (NULL == image || NULL == fileName) + { + return HGBASE_ERR_INVALIDARG; + } + + if (NULL != info) + { + if (info->type != HGIMGFMT_PNMTYPE_RGB_BINRAY) + { + return HGBASE_ERR_INVALIDARG; + } + } + + HGImageInfo imgInfo; + HGBase_GetImageInfo(image, &imgInfo); + if (imgInfo.type != HGBASE_IMGTYPE_RGB) + { + return HGBASE_ERR_INVALIDDATA; + } + + return BnmSaveP6Image(image, fileName); +}