HGGitLab

Commit 689ea917 authored by luoliangyi's avatar luoliangyi

1.完成ImgFmt模块的开发

2.完善HGImage模块的图像转换功能
parent 172b4ce9
......@@ -8,3 +8,4 @@
/imgfmt
/base
/app
/build
This diff is collapsed.
......@@ -376,7 +376,7 @@ HGEXTERN_C HGResult HGAPI HGBase_ReverseImage(HGImage image, HGImage destImage);
* 说明:
* 1) 拷贝的时候会自动处理type不一致的情况
* 2) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGB、HGBASE_IMGTYPE_RGBA向HGBASE_IMGTYPE_GRAY拷贝时自动灰度化
* 3) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_RGB向HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGBA拷贝时Alpha通道填充255
* 3) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_RGB向HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGBA拷贝时Alpha通道不变
* 4) 拷贝的时候自动处理origin不一致的情况
* 5) 操作的只是图像的ROI区域, 要求两个图像的ROI区域一样大
* 6) image和destImage不能是同一个图像句柄
......
......@@ -103,6 +103,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/twain/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
......@@ -123,6 +124,7 @@
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/twain/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
......@@ -149,6 +151,7 @@ copy $(SolutionDir)..\..\twain_user\*.h $(SolutionDir)..\..\release\include\twai
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/twain/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
......@@ -169,6 +172,7 @@ copy $(SolutionDir)..\..\twain_user\*.h $(SolutionDir)..\..\release\include\twai
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../third_party/twain/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
......
B// Microsoft Visual C++ generated resource script.
......
......@@ -54,6 +54,9 @@ CHGTestDlg::CHGTestDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_HGTEST_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_dsm = NULL;
m_ds = NULL;
}
void CHGTestDlg::DoDataExchange(CDataExchange* pDX)
......@@ -65,6 +68,8 @@ BEGIN_MESSAGE_MAP(CHGTestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CHGTestDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CHGTestDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
......@@ -98,14 +103,27 @@ BOOL CHGTestDlg::OnInitDialog()
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
#if 0
HGImage image1 = NULL;
HGImgFmt_LoadImage("D:\\1.tif", 0, NULL, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_BOTTOM, &image1);
HGTwain_LoadDSM(&m_dsm);
HGTwain_OpenDSM(m_dsm, m_hWnd);
HGTwain_GetDefaultDS(m_dsm, &m_ds);
HGImageInfo info;
HGBase_GetImageInfo(image1, &info);
HGImage image2 = NULL;
HGBase_CreateImage(info.width, info.height, HGBASE_IMGTYPE_BGR, HGBASE_IMGORIGIN_TOP, &image2);
HGTwain_OpenDS(m_dsm, m_ds);
HGTwain_EnableDS(m_dsm, m_ds, HGFALSE);
HGImageRoi roi1 = {200, 200, 800, 600};
HGBase_SetImageROI(image1, &roi1);
HGImageRoi roi2 = { 500, 500, 1100, 900 };
HGBase_SetImageROI(image2, &roi2);
HGBase_CopyImage(image1, image2);
HGImgFmt_SaveImage(image1, 0, NULL, "D:\\11111.bmp");
HGImgFmt_SaveImage(image2, 0, NULL, "D:\\22222.bmp");
#endif
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
......@@ -168,12 +186,37 @@ BOOL CHGTestDlg::PreTranslateMessage(MSG* pMsg)
{
HGImage image = NULL;
HGTwain_ImageNativeXfer(m_dsm, m_ds, 0, HGBASE_IMGORIGIN_TOP, &image);
HGImgFmt_SaveImage(image, 0, NULL, "D:\\1.bmp");
HGBase_DestroyImage(image);
}
else if (HGTWAIN_EVENT_CLOSEDSREQ == event)
{
HGTwain_UnloadDSM(m_dsm);
m_dsm = NULL;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CHGTestDlg::OnBnClickedButton1()
{
if (NULL != m_dsm)
{
return;
}
HGTwain_LoadDSM(&m_dsm);
HGTwain_OpenDSM(m_dsm, m_hWnd);
HGTwain_GetDefaultDS(m_dsm, &m_ds);
HGTwain_OpenDS(m_dsm, m_ds);
HGTwain_EnableDS(m_dsm, m_ds, HGTRUE);
}
void CHGTestDlg::OnBnClickedButton2()
{
HGTwain_UnloadDSM(m_dsm);
m_dsm = NULL;
}
......@@ -35,4 +35,6 @@ protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
};
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// HGTest.rc 使用
// HGTest.rc 使用
//
#define IDR_MAINFRAME 128
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_HGTEST_DIALOG 102
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_HGTEST_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
// 新对象的下一组默认值
//
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
......@@ -6,22 +6,22 @@
#ifdef _WIN64
#ifdef _DEBUG
#pragma comment(lib, "../x64/Debug/HGTwainUser.lib")
#pragma comment(lib, "../x64/Debug/HGBase.lib")
#pragma comment(lib, "../x64/Debug/HGImgFmt.lib")
#pragma comment(lib, "../x64/Debug/HGTwainUser.lib")
#else
#pragma comment(lib, "../x64/Release/HGTwainUser.lib")
#pragma comment(lib, "../x64/Release/HGBase.lib")
#pragma comment(lib, "../x64/Release/HGImgFmt.lib")
#pragma comment(lib, "../x64/Release/HGTwainUser.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "../Debug/HGTwainUser.lib")
#pragma comment(lib, "../Debug/HGBase.lib")
#pragma comment(lib, "../Debug/HGImgFmt.lib")
#pragma comment(lib, "../Debug/HGTwainUser.lib")
#else
#pragma comment(lib, "../Release/HGTwainUser.lib")
#pragma comment(lib, "../Release/HGBase.lib")
#pragma comment(lib, "../Release/HGImgFmt.lib")
#pragma comment(lib, "../Release/HGTwainUser.lib")
#endif
#endif
......@@ -11,7 +11,7 @@
#include "framework.h"
#include "../../../base/HGBase.h"
#include "../../../twain_user/HGTwain.h"
#include "../../../imgfmt/HGImgFmt.h"
#include "../../../twain_user/HGTwain.h"
#endif //PCH_H
......@@ -64,12 +64,13 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
else
{
if (0 != imgType && HGBASE_IMGTYPE_GRAY != imgType && HGBASE_IMGTYPE_RGB != imgType
&& HGBASE_IMGTYPE_RGBA != imgType)
&& HGBASE_IMGTYPE_RGBA != imgType && HGBASE_IMGTYPE_BGR != imgType
&& HGBASE_IMGTYPE_BGRA != imgType)
{
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != imgOrigin)
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -177,20 +178,32 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
return HGBASE_ERR_FAIL;
}
uint32_t xDpi = (uint32_t)((double)bmp.x_pels_per_meter / 39.3700787 + 0.5);
uint32_t yDpi = (uint32_t)((double)bmp.y_pels_per_meter / 39.3700787 + 0.5);
HGBase_SetImageDpi(image2, xDpi, yDpi);
uint8_t* data;
HGBase_GetImageData(image2, &data);
HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo);
uint32_t widthStep = imgInfo.widthStep;
HGByte* src = (HGByte*)bmp.bitmap;
HGByte* dest = data;
HGSize destStep = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgOrigin)
{
dest = data + (HGUSize)(bmp.height - 1) * (HGUSize)imgInfo.widthStep;
destStep = -(HGSize)imgInfo.widthStep;
}
if (HGBASE_IMGTYPE_GRAY == imgType)
{
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)bmp.height; i++)
{
uint8_t* pEx = (uint8_t*)bmp.bitmap + (uintptr_t)i * (uintptr_t)bmp.width * (uintptr_t)4;
uint8_t* pEx = src + (HGSize)i * (HGSize)(bmp.width * 4);
uint8_t* pExEnd = pEx + bmp.width * 4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
......@@ -207,9 +220,9 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)bmp.height; i++)
{
uint8_t* pEx = (uint8_t*)bmp.bitmap + (uintptr_t)i * (uintptr_t)bmp.width * (uintptr_t)4;
uint8_t* pEx = src + (HGSize)i * (HGSize)(bmp.width * 4);
uint8_t* pExEnd = pEx + bmp.width * 4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
......@@ -222,6 +235,47 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
}
}
}
else if (HGBASE_IMGTYPE_BGR == imgType)
{
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)bmp.height; i++)
{
uint8_t* pEx = src + (HGSize)i * (HGSize)(bmp.width * 4);
uint8_t* pExEnd = pEx + bmp.width * 4;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
pDestEx[2] = pEx[0];
pDestEx[1] = pEx[1];
pDestEx[0] = pEx[2];
pEx += 4;
pDestEx += 3;
}
}
}
else if (HGBASE_IMGTYPE_BGRA == imgType)
{
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)bmp.height; i++)
{
uint8_t* pEx = src + (HGSize)i * (HGSize)(bmp.width * 4);
uint8_t* pExEnd = pEx + bmp.width * 4;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
pDestEx[2] = pEx[0];
pDestEx[1] = pEx[1];
pDestEx[0] = pEx[2];
pDestEx[3] = pEx[3];
pEx += 4;
pDestEx += 4;
}
}
}
else
{
assert(HGBASE_IMGTYPE_RGBA == imgType);
......@@ -229,8 +283,8 @@ HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)bmp.height; i++)
{
uint8_t* pEx = (uint8_t*)bmp.bitmap + (uintptr_t)i * (uintptr_t)bmp.width * (uintptr_t)4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pEx = src + (HGSize)i * (HGSize)(bmp.width * 4);
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
memcpy(pDestEx, pEx, bmp.width * 4);
}
}
......@@ -258,12 +312,6 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
// 检查合法性
}
FILE* file = fopen(fileName, "wb");
if (NULL == file)
{
return HGBASE_ERR_ACCESSDENIED;
}
HGImageInfo imgInfo;
HGBase_GetImageInfo(image, &imgInfo);
......@@ -273,15 +321,10 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
uint32_t type = imgInfo.type;
uint32_t origin = imgInfo.origin;
if (HGBASE_IMGTYPE_GRAY != type && HGBASE_IMGTYPE_RGB != type
&& HGBASE_IMGTYPE_RGBA != type)
{
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != origin)
FILE* file = fopen(fileName, "wb");
if (NULL == file)
{
return HGBASE_ERR_INVALIDARG;
return HGBASE_ERR_ACCESSDENIED;
}
uint8_t* data;
......@@ -303,7 +346,7 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
uint8_t ih[40];
*(uint32_t*)ih = 40;
*(int32_t*)(ih + 4) = (int32_t)width;
*(int32_t*)(ih + 8) = -(int32_t)height;
*(int32_t*)(ih + 8) = (HGBASE_IMGORIGIN_BOTTOM == origin) ? (int32_t)height : -(int32_t)height;
*(uint16_t*)(ih + 12) = 1;
*(uint32_t*)(ih + 16) = 0;
*(uint32_t*)(ih + 20) = (widthStep * height);
......@@ -312,6 +355,12 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
*(uint32_t*)(ih + 32) = 0;
*(uint32_t*)(ih + 36) = 0;
HGUInt xDpi, yDpi;
HGBase_GetImageDpi(image, &xDpi, &yDpi);
*(int32_t*)(ih + 24) = (uint32_t)((double)xDpi * 39.3700787 + 0.5);
*(int32_t*)(ih + 28) = (uint32_t)((double)yDpi * 39.3700787 + 0.5);
if (NULL != info)
{
*(int32_t*)(ih + 24) = (int32_t)info->xPelsPerMeter;
......@@ -367,6 +416,26 @@ HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, c
fwrite(buffer, 1, widthStep * height, file);
}
else if (HGBASE_IMGTYPE_BGR == type)
{
*(uint32_t*)(fh + 2) = 54 + widthStep * height;
*(uint32_t*)(fh + 10) = 54;
*(uint16_t*)(ih + 14) = 24;
fwrite(fh, 14, 1, file);
fwrite(ih, 40, 1, file);
fwrite(data, 1, widthStep * height, file);
}
else if (HGBASE_IMGTYPE_BGRA == type)
{
*(uint32_t*)(fh + 2) = 54 + widthStep * height;
*(uint32_t*)(fh + 10) = 54;
*(uint16_t*)(ih + 14) = 32;
fwrite(fh, 14, 1, file);
fwrite(ih, 40, 1, file);
fwrite(data, 1, widthStep * height, file);
}
else
{
assert(HGBASE_IMGTYPE_RGBA == type);
......
......@@ -200,32 +200,11 @@ HGEXTERN_C HGResult HGAPI HGImgFmt_IsMultiImgFmtType(HGUInt fmtType, HGBool* isM
HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgFmtLoadInfo* info,
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
{
if (NULL == fileName)
{
return HGBASE_ERR_INVALIDARG;
}
if (fmtType > HGIMGFMT_TYPE_OFD)
{
return HGBASE_ERR_INVALIDARG;
}
if (NULL == image)
{
if (0 != imgType || 0 != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
}
else
{
if (imgType < HGBASE_IMGTYPE_GRAY || imgType > HGBASE_IMGTYPE_RGBA
|| imgOrigin < HGBASE_IMGORIGIN_TOP || imgOrigin > HGBASE_IMGORIGIN_BOTTOM)
{
return HGBASE_ERR_INVALIDARG;
}
}
if (HGIMGFMT_TYPE_JPEG == fmtType)
{
HGJpegLoadInfo jpegInfo;
......@@ -512,16 +491,11 @@ HGResult HGAPI HGImgFmt_LoadImage(const HGChar* fileName, HGUInt fmtType, HGImgF
HGResult HGAPI HGImgFmt_SaveImage(HGImage image, HGUInt fmtType, const HGImgFmtSaveInfo* info, const HGChar* fileName)
{
if (NULL == image || fmtType > HGIMGFMT_TYPE_OFD || NULL == fileName)
if (fmtType > HGIMGFMT_TYPE_OFD)
{
return HGBASE_ERR_INVALIDARG;
}
if (NULL != info)
{
// 检查info合法性
}
if (0 == fmtType)
{
HGImgFmt_GetImgFmtTypeFromFileName(fileName, &fmtType);
......@@ -836,7 +810,7 @@ HGResult HGAPI HGImgFmt_GetImagePageCount(HGImgFmtReader reader, HGUInt* count)
HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index, HGImgFmtLoadInfo* info,
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
{
if (NULL == reader || NULL == image)
if (NULL == reader)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -994,7 +968,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromReader(HGImgFmtReader reader, HGUInt index,
HGResult HGAPI HGImgFmt_OpenImageWriter(const HGChar* fileName, HGUInt fmtType, HGImgFmtWriter* writer)
{
if (NULL == fileName || fmtType > HGIMGFMT_TYPE_OFD || NULL == writer)
if (fmtType > HGIMGFMT_TYPE_OFD || NULL == writer)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -1093,16 +1067,11 @@ HGResult HGAPI HGImgFmt_CloseImageWriter(HGImgFmtWriter writer)
HGResult HGAPI HGImgFmt_SaveImageToWriter(HGImgFmtWriter writer, HGImage image, const HGImgFmtSaveInfo* info)
{
if (NULL == writer || NULL == image)
if (NULL == writer)
{
return HGBASE_ERR_INVALIDARG;
}
if (NULL != info)
{
// 检查合法性
}
HGImgFmtWriterImpl* imgFmtWriterImpl = (HGImgFmtWriterImpl*)writer;
if (HGIMGFMT_TYPE_JPEG == imgFmtWriterImpl->fmtType)
{
......
......@@ -53,7 +53,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != imgOrigin)
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -130,16 +130,28 @@ HGResult HGAPI HGImgFmt_LoadJpegImage(const HGChar* fileName, HGJpegLoadInfo* in
longjmp(jerr.setjmp_buffer, (int)HGBASE_ERR_FAIL);
}
uint8_t* data;
HGBase_GetImageData(image2, &data);
if (1 == cinfo.density_unit)
{
HGBase_SetImageDpi(image2, cinfo.X_density, cinfo.Y_density);
}
HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo);
uint32_t widthStep = imgInfo.widthStep;
uint8_t* data;
HGBase_GetImageData(image2, &data);
uint8_t* p = data;
HGSize step = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgOrigin)
{
p = data + (HGUSize)(imgInfo.height - 1) * (HGUSize)imgInfo.widthStep;
step = -(HGSize)imgInfo.widthStep;
}
while (cinfo.output_scanline < cinfo.output_height)
{
JSAMPROW p = data + (uintptr_t)cinfo.output_scanline * (uintptr_t)widthStep;
jpeg_read_scanlines(&cinfo, &p, 1);
JSAMPROW pEx = p + (HGSize)cinfo.output_scanline * (HGSize)step;
jpeg_read_scanlines(&cinfo, &pEx, 1);
}
jpeg_finish_decompress(&cinfo);
......@@ -174,7 +186,7 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo*
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != imgOrigin)
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -248,16 +260,28 @@ HGResult HGAPI HGImgFmt_LoadJpegImageFromBuffer(HGBuffer buffer, HGJpegLoadInfo*
longjmp(jerr.setjmp_buffer, (int)HGBASE_ERR_FAIL);
}
uint8_t* data;
HGBase_GetImageData(image2, &data);
if (1 == cinfo.density_unit)
{
HGBase_SetImageDpi(image2, cinfo.X_density, cinfo.Y_density);
}
HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo);
uint32_t widthStep = imgInfo.widthStep;
uint8_t* data;
HGBase_GetImageData(image2, &data);
uint8_t* p = data;
HGSize step = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgOrigin)
{
p = data + (HGUSize)(imgInfo.height - 1) * (HGUSize)imgInfo.widthStep;
step = -(HGSize)imgInfo.widthStep;
}
while (cinfo.output_scanline < cinfo.output_height)
{
JSAMPROW p = data + (uintptr_t)cinfo.output_scanline * (uintptr_t)widthStep;
jpeg_read_scanlines(&cinfo, &p, 1);
JSAMPROW pEx = p + (HGSize)cinfo.output_scanline * (HGSize)step;
jpeg_read_scanlines(&cinfo, &pEx, 1);
}
jpeg_finish_decompress(&cinfo);
......@@ -292,11 +316,6 @@ HGResult HGAPI HGImgFmt_SaveJpegImage(HGImage image, const HGJpegSaveInfo* info,
return HGBASE_ERR_INVALIDDATA;
}
if (HGBASE_IMGORIGIN_TOP != imgInfo.origin)
{
return HGBASE_ERR_INVALIDDATA;
}
FILE* file = fopen(fileName, "wb");
if (NULL == file)
{
......@@ -332,7 +351,14 @@ HGResult HGAPI HGImgFmt_SaveJpegImage(HGImage image, const HGJpegSaveInfo* info,
cinfo.in_color_space = (HGBASE_IMGTYPE_GRAY != type) ? JCS_RGB : JCS_GRAYSCALE;
jpeg_set_defaults(&cinfo);
HGUInt xDpi, yDpi;
HGBase_GetImageDpi(image, &xDpi, &yDpi);
HGUInt quality = 80;
cinfo.density_unit = 1;
cinfo.X_density = xDpi;
cinfo.Y_density = yDpi;
if (NULL != info)
{
quality = info->quality;
......@@ -344,10 +370,18 @@ HGResult HGAPI HGImgFmt_SaveJpegImage(HGImage image, const HGJpegSaveInfo* info,
jpeg_set_quality(&cinfo, (int)quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
uint8_t* p = data;
HGSize step = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
{
p = data + (HGUSize)(imgInfo.height - 1) * (HGUSize)imgInfo.widthStep;
step = -(HGSize)imgInfo.widthStep;
}
while (cinfo.next_scanline < cinfo.image_height)
{
uint8_t* p = data + (uintptr_t)cinfo.next_scanline * (uintptr_t)widthStep;
jpeg_write_scanlines(&cinfo, &p, 1);
uint8_t* pEx = p + (HGSize)cinfo.next_scanline * (HGSize)step;
jpeg_write_scanlines(&cinfo, &pEx, 1);
}
jpeg_finish_compress(&cinfo);
......@@ -382,11 +416,6 @@ HGResult HGAPI HGImgFmt_SaveJpegImageToBuffer(HGImage image, const HGJpegSaveInf
return HGBASE_ERR_INVALIDDATA;
}
if (HGBASE_IMGORIGIN_TOP != imgInfo.origin)
{
return HGBASE_ERR_INVALIDDATA;
}
unsigned char* outbuffer = NULL;
size_t outSize = 0;
......@@ -420,7 +449,14 @@ HGResult HGAPI HGImgFmt_SaveJpegImageToBuffer(HGImage image, const HGJpegSaveInf
cinfo.in_color_space = (HGBASE_IMGTYPE_GRAY != type) ? JCS_RGB : JCS_GRAYSCALE;
jpeg_set_defaults(&cinfo);
HGUInt xDpi, yDpi;
HGBase_GetImageDpi(image, &xDpi, &yDpi);
HGUInt quality = 80;
cinfo.density_unit = 1;
cinfo.X_density = xDpi;
cinfo.Y_density = yDpi;
if (NULL != info)
{
quality = info->quality;
......@@ -432,10 +468,18 @@ HGResult HGAPI HGImgFmt_SaveJpegImageToBuffer(HGImage image, const HGJpegSaveInf
jpeg_set_quality(&cinfo, (int)quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
uint8_t* p = data;
HGSize step = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo.origin)
{
p = data + (HGUSize)(imgInfo.height - 1) * (HGUSize)imgInfo.widthStep;
step = -(HGSize)imgInfo.widthStep;
}
while (cinfo.next_scanline < cinfo.image_height)
{
uint8_t* p = data + (uintptr_t)cinfo.next_scanline * (uintptr_t)widthStep;
jpeg_write_scanlines(&cinfo, &p, 1);
uint8_t* pEx = p + (HGSize)cinfo.next_scanline * (HGSize)step;
jpeg_write_scanlines(&cinfo, &pEx, 1);
}
jpeg_finish_compress(&cinfo);
......
......@@ -231,7 +231,7 @@ HGResult HGAPI HGImgFmt_GetPdfPageInfo(HGPdfReader reader, HGUInt page, HGPdfPag
HGResult HGAPI HGImgFmt_LoadImageFromPdfReader(HGPdfReader reader, HGUInt page, HGFloat xScale, HGFloat yScale,
HGUInt imgType, HGUInt imgOrigin, HGImage* image)
{
if (NULL == reader || NULL == image || HGBASE_IMGTYPE_RGB != imgType)
if (NULL == reader || NULL == image)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -252,7 +252,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromPdfReader(HGPdfReader reader, HGUInt page,
*image = NULL;
HGImageInfo imgInfo = { (uint32_t)width, (uint32_t)height, HGBASE_IMGTYPE_RGB, (uint32_t)pix->stride, HGBASE_IMGORIGIN_TOP };
HGBase_CreateImageFromData(pix->samples, &imgInfo, NULL, 0, imgOrigin, image);
HGBase_CreateImageFromData(pix->samples, &imgInfo, NULL, imgType, imgOrigin, image);
if (NULL != *image)
{
ret = HGBASE_ERR_OK;
......
This diff is collapsed.
......@@ -78,12 +78,13 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
else
{
if (0 != imgType && HGBASE_IMGTYPE_GRAY != imgType && HGBASE_IMGTYPE_RGB != imgType
&& HGBASE_IMGTYPE_RGBA != imgType)
&& HGBASE_IMGTYPE_RGBA != imgType && HGBASE_IMGTYPE_BGR != imgType
&& HGBASE_IMGTYPE_BGRA != imgType)
{
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != imgOrigin)
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
{
return HGBASE_ERR_INVALIDARG;
}
......@@ -161,11 +162,25 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
return HGBASE_ERR_FAIL;
}
if (2 == resolutionUnit)
{
uint32_t xDpi = (uint32_t)(xResolution + 0.5f);
uint32_t yDpi = (uint32_t)(yResolution + 0.5f);
HGBase_SetImageDpi(image2, xDpi, yDpi);
}
uint8_t* data;
HGBase_GetImageData(image2, &data);
HGImageInfo imgInfo;
HGBase_GetImageInfo(image2, &imgInfo);
uint32_t widthStep = imgInfo.widthStep;
HGByte* dest = data;
HGSize destStep = (HGSize)imgInfo.widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == imgOrigin)
{
dest = data + (HGUSize)(imgInfo.height - 1) * (HGUSize)imgInfo.widthStep;
destStep = -(HGSize)imgInfo.widthStep;
}
if (HGBASE_IMGTYPE_GRAY == imgType)
{
......@@ -174,7 +189,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
{
uint8_t* pEx = (uint8_t*)buffer + (uintptr_t)i * (uintptr_t)width * (uintptr_t)4;
uint8_t* pExEnd = pEx + width * 4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
......@@ -193,7 +208,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
{
uint8_t* pEx = (uint8_t*)buffer + (uintptr_t)i * (uintptr_t)width * (uintptr_t)4;
uint8_t* pExEnd = pEx + width * 4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
......@@ -206,6 +221,47 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
}
}
}
else if (HGBASE_IMGTYPE_BGR == imgType)
{
//#pragma omp parallel for
for (int32 i = 0; i < (int32)height; i++)
{
uint8_t* pEx = (uint8_t*)buffer + (uintptr_t)i * (uintptr_t)width * (uintptr_t)4;
uint8_t* pExEnd = pEx + width * 4;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
pDestEx[0] = pEx[2];
pDestEx[1] = pEx[1];
pDestEx[2] = pEx[0];
pEx += 4;
pDestEx += 3;
}
}
}
else if (HGBASE_IMGTYPE_BGRA == imgType)
{
//#pragma omp parallel for
for (int32 i = 0; i < (int32)height; i++)
{
uint8_t* pEx = (uint8_t*)buffer + (uintptr_t)i * (uintptr_t)width * (uintptr_t)4;
uint8_t* pExEnd = pEx + width * 4;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
while (pEx < pExEnd)
{
pDestEx[0] = pEx[2];
pDestEx[1] = pEx[1];
pDestEx[2] = pEx[0];
pDestEx[3] = pEx[3];
pEx += 4;
pDestEx += 4;
}
}
}
else
{
assert(HGBASE_IMGTYPE_RGBA == imgType);
......@@ -214,7 +270,7 @@ HGResult HGAPI HGImgFmt_LoadImageFromTiffReader(HGTiffReader reader, HGUInt inde
for (int32 i = 0; i < (int32)height; i++)
{
uint8_t* pEx = (uint8_t*)buffer + (uintptr_t)i * (uintptr_t)width * (uintptr_t)4;
uint8_t* pDestEx = data + (uintptr_t)i * (uintptr_t)widthStep;
uint8_t* pDestEx = dest + (HGSize)i * (HGSize)destStep;
memcpy(pDestEx, pEx, width * 4);
}
}
......@@ -283,11 +339,6 @@ HGResult HGAPI HGImgFmt_SaveImageToTiffWriter(HGTiffWriter writer, HGImage image
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGORIGIN_TOP != origin)
{
return HGBASE_ERR_INVALIDARG;
}
uint8_t* data;
HGBase_GetImageData(image, &data);
......@@ -322,6 +373,13 @@ HGResult HGAPI HGImgFmt_SaveImageToTiffWriter(HGTiffWriter writer, HGImage image
}
TIFFSetField(tif, TIFFTAG_COLORMAP, rTable, gTable, bTable);
HGUInt xDpi, yDpi;
HGBase_GetImageDpi(image, &xDpi, &yDpi);
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, 2);
TIFFSetField(tif, TIFFTAG_XRESOLUTION, xDpi);
TIFFSetField(tif, TIFFTAG_YRESOLUTION, yDpi);
if (NULL != info)
{
TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, info->resolutionUnit);
......@@ -329,10 +387,19 @@ HGResult HGAPI HGImgFmt_SaveImageToTiffWriter(HGTiffWriter writer, HGImage image
TIFFSetField(tif, TIFFTAG_YRESOLUTION, info->yResolution);
}
for (uint32_t i = 0; i < height; ++i)
HGByte* p = data;
HGSize step = (HGSize)widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
{
p = data + (HGUSize)(height - 1) * (HGUSize)widthStep;
step = -(HGSize)widthStep;
}
//#pragma omp parallel for
for (int32_t i = 0; i < (int32_t)height; ++i)
{
uint8_t* p = data + i * widthStep;
TIFFWriteScanline(tif, p, i, 0);
uint8_t* pEx = p + (HGSize)i * (HGSize)step;
TIFFWriteScanline(tif, pEx, i, 0);
}
TIFFWriteDirectory(tif);
......
......@@ -376,7 +376,7 @@ HGEXTERN_C HGResult HGAPI HGBase_ReverseImage(HGImage image, HGImage destImage);
* 说明:
* 1) 拷贝的时候会自动处理type不一致的情况
* 2) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGB、HGBASE_IMGTYPE_RGBA向HGBASE_IMGTYPE_GRAY拷贝时自动灰度化
* 3) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_RGB向HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGBA拷贝时Alpha通道填充255
* 3) HGBASE_IMGTYPE_BGR、HGBASE_IMGTYPE_RGB向HGBASE_IMGTYPE_BGRA、HGBASE_IMGTYPE_RGBA拷贝时Alpha通道不变
* 4) 拷贝的时候自动处理origin不一致的情况
* 5) 操作的只是图像的ROI区域, 要求两个图像的ROI区域一样大
* 6) image和destImage不能是同一个图像句柄
......
......@@ -3,7 +3,7 @@
#include "HGTwain.h"
#include "../base/HGDll.h"
#include "../third_party/twain/twain.h"
#include "twain.h"
#include <vector>
struct HGTwainDSImpl
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment