code_app/modules/base/HGImage.h

391 lines
14 KiB
C
Raw Normal View History

2022-05-03 10:25:52 +00:00
#ifndef __HGIMAGE_H__
#define __HGIMAGE_H__
#include "HGDef.h"
#include "HGBaseErr.h"
#if defined(HG_CMP_MSC)
#include <windows.h>
#endif
HG_DECLARE_HANDLE(HGImage);
/* 1位黑白图 */
#define HGBASE_IMGTYPE_BINARY 1L
2022-05-03 10:25:52 +00:00
/* 8位灰度图 */
#define HGBASE_IMGTYPE_GRAY 2L
2022-05-03 10:25:52 +00:00
/* 24位真彩色B8G8R8格式 */
#define HGBASE_IMGTYPE_BGR 3L
2022-05-03 10:25:52 +00:00
/* 24位真彩色R8G8B8格式 */
#define HGBASE_IMGTYPE_RGB 4L
2022-05-03 10:25:52 +00:00
/* 32位真彩色带Alpha通道B8G8R8A8格式 */
#define HGBASE_IMGTYPE_BGRA 5L
2022-05-03 10:25:52 +00:00
/* 32位真彩色带Alpha通道R8G8B8A8格式 */
#define HGBASE_IMGTYPE_RGBA 6L
2022-05-03 10:25:52 +00:00
/* 顶左结构 */
#define HGBASE_IMGORIGIN_TOP 1L
/* 底左结构 */
#define HGBASE_IMGORIGIN_BOTTOM 2L
#pragma pack(push)
#pragma pack(4)
2022-05-03 10:25:52 +00:00
/* 图像信息 */
typedef struct
{
HGUInt width; /* 宽(像素),列数 */
HGUInt height; /* 高(像素),行数 */
HGUInt type; /* 类型参见HGBASE_IMGTYPE_* */
HGUInt widthStep; /* 每行的字节数 */
HGUInt origin; /* 数据排列方式参见HGBASE_IMGORIGIN_* */
}HGImageInfo;
/* 图像感兴趣区域 */
typedef struct
{
HGUInt left;
HGUInt top;
HGUInt right;
HGUInt bottom;
}HGImageRoi;
#pragma pack(pop)
2022-05-03 10:25:52 +00:00
/* 创建空白的新图像
* :
* 1) width: in,
* 2) height: in,
* 3) type: in,
* 4) origin: in,
* 5) image: out
* :
* 1windows系统上type为HGBASE_IMGTYPE_BINARYHGBASE_IMGTYPE_GRAYHGBASE_IMGTYPE_BGR或HGBASE_IMGTYPE_BGRA时DIB位图(HBITMAP),
2022-05-03 10:25:52 +00:00
* (HBITMAP); linux系统上(HBITMAP)
* 2) width=width; height=height; type=type; widthStep为4字节对齐; origin=origin
* 3) roi为{0, 0, width, height}
2023-02-27 07:05:40 +00:00
* 4) xdpi=0, ydpi=0
2022-05-03 10:25:52 +00:00
*/
HGEXPORT HGResult HGAPI HGBase_CreateImage(HGUInt width, HGUInt height, HGUInt type, HGUInt origin, HGImage* image);
/* 从源数据创建新图像(不分配内存, 也不拷贝数据)
* :
* 1) data: in,
* 2) info: in,
* 3) image: out
2022-05-03 10:25:52 +00:00
* :
* 1) DIB位图(windows系统上, HBITMAP)使,
* 2) width=info->width; height=info->height; type=info->type; widthStep=info->widthStep;
2022-05-03 10:25:52 +00:00
* origin=info->origin
* 3) roi为{0, 0, width, height}
2023-02-27 07:05:40 +00:00
* 4) xdpi=0, ydpi=0
2022-05-03 10:25:52 +00:00
*/
HGEXPORT HGResult HGAPI HGBase_CreateImageWithData(HGByte* data, const HGImageInfo* info, HGImage* image);
2022-05-03 10:25:52 +00:00
/* 从源数据创建新图像
* :
* 1) data: in,
* 2) info: in,
* 3) roi: in, , NULL表示整个图像区域
* 4) type: in, , 0
* 5) origin: in, , 0
2022-05-03 10:25:52 +00:00
* 6) image: out
* :
* 1windows系统上type为HGBASE_IMGTYPE_BINARYHGBASE_IMGTYPE_GRAYHGBASE_IMGTYPE_BGR或HGBASE_IMGTYPE_BGRA时DIB位图(HBITMAP),
2022-05-03 10:25:52 +00:00
* (HBITMAP); linux系统上(HBITMAP)
* 2) width=roi->right-roi->left; height=roi->bottom-roi->top; type=type; widthStep为4字节对齐;
* origin=origin, origin和info->origin不一致
* 3) roi为{0, 0, width, height}
2023-02-27 07:05:40 +00:00
* 4) xdpi=0, ydpi=0
2022-05-03 10:25:52 +00:00
*/
HGEXPORT HGResult HGAPI HGBase_CreateImageFromData(HGByte* data, const HGImageInfo *info, const HGImageRoi *roi,
HGUInt type, HGUInt origin, HGImage* image);
#if defined(HG_CMP_MSC)
/* 从DIB位图创建新图像
* :
* 1) hBmp: in, DIB位图句柄
* 2) roi: DIB位图的感兴趣区域, NULL表示整个图像区域
* 3) type: in, , 0DIB位图最接近的type
* 4) origin: in, ,
2022-05-03 10:25:52 +00:00
* 5) image: out
* :
* 1type为HGBASE_IMGTYPE_BINARYHGBASE_IMGTYPE_GRAYHGBASE_IMGTYPE_BGR或HGBASE_IMGTYPE_BGRA时DIB位图(HBITMAP),
2022-05-03 10:25:52 +00:00
* (HBITMAP)
* 2) width=roi->right-roi->left; height=roi->bottom-roi->top; type=type; widthStep为4字节对齐;
* origin=origin
2022-05-03 10:25:52 +00:00
* 3) roi为{0, 0, width, height}
* 4) xdpi=hBmp的xDPI, ydpi=hBmp的yDPI
2022-05-03 10:25:52 +00:00
*/
HGEXPORT HGResult HGAPI HGBase_CreateImageFromHBITMAP(HBITMAP hBmp, const HGImageRoi* roi,
HGUInt type, HGUInt origin, HGImage* image);
/* 从DIB内存创建新图像
* :
* 1) hMem: in, DIB内存句柄
* 2) roi: DIB内存的感兴趣区域, NULL表示整个图像区域
* 3) type: in, , 0DIB内存最接近的type
* 4) origin: in, ,
2022-05-03 10:25:52 +00:00
* 5) image: out
* :
* 1type为HGBASE_IMGTYPE_BINARYHGBASE_IMGTYPE_GRAYHGBASE_IMGTYPE_BGR或HGBASE_IMGTYPE_BGRA时DIB位图(HBITMAP),
2022-05-03 10:25:52 +00:00
* (HBITMAP)
* 2) width=roi->right-roi->left; height=roi->bottom-roi->top; type=type; widthStep为4字节对齐;
* origin=origin
2022-05-03 10:25:52 +00:00
* 3) roi为{0, 0, width, height}
* 4) xdpi=DIB的xDPI, ydpi=DIB的yDPI
*/
HGEXPORT HGResult HGAPI HGBase_CreateImageFromDIB(HGLOBAL hMem, const HGImageRoi* roi,
HGUInt type, HGUInt origin, HGImage* image);
#endif /* HG_CMP_MSC */
/* 从源图像创建新图像
* :
* 1) srcImage: in,
* 2) type: in, , 0
* 3) origin: in, , 0
2022-05-03 10:25:52 +00:00
* 4) image: out
*
* 1windows系统上type为HGBASE_IMGTYPE_BINARYHGBASE_IMGTYPE_GRAYHGBASE_IMGTYPE_BGR或HGBASE_IMGTYPE_BGRA时DIB位图(HBITMAP),
2022-05-03 10:25:52 +00:00
* (HBITMAP); linux系统上(HBITMAP)
* 2) width=srcImage->roi.right-srcImage->roi.left; height=srcImage->roi.bottom-srcImage->roi.top;
* type=type; widthStep为4字节对齐; origin=origin, origin和srcImage->origin不一致
* 3) roi为{0, 0, width, height}
* 4) xdpi=srcImage->xdpi, ydpi=srcImage->ydpi
*/
HGEXPORT HGResult HGAPI HGBase_CloneImage(HGImage srcImage, HGUInt type, HGUInt origin, HGImage* image);
/* 销毁图像
* :
* 1) image: in,
* :
* 1) ,
* 2) DIB位图(windows上), DeleteObject进行销毁
* 3) DIB位图使
*/
HGEXPORT HGResult HGAPI HGBase_DestroyImage(HGImage image);
/* 获取图像数据地址
* :
* 1) image: in,
* 2) data: out,
* :
* 1) ,
* 2) DIB位图DIB位图像素数据的内存地址
* 3)
*/
HGEXPORT HGResult HGAPI HGBase_GetImageData(HGImage image, HGByte** data);
/* 获取图像信息
* :
* 1) image: in,
* 2) info: out,
* :
*/
HGEXPORT HGResult HGAPI HGBase_GetImageInfo(HGImage image, HGImageInfo* info);
2022-05-03 10:25:52 +00:00
/* 获取图像感兴趣区域
* :
* 1) image: in,
* 2) roi: out,
* :
* 1) , left=0,top=0,right=width,bottom=height
* 2)
*/
HGEXPORT HGResult HGAPI HGBase_GetImageROI(HGImage image, HGImageRoi* roi);
2022-05-03 10:25:52 +00:00
/* 设置图像感兴趣区域
* :
* 1) image: in,
* 2) roi: in,
* :
* 1) roi所指定的区域必须是整个图像幅面的子集
*/
HGEXPORT HGResult HGAPI HGBase_SetImageROI(HGImage image, const HGImageRoi* roi);
/* 重置图像感兴趣区域
* :
* 1) image: in,
* :
* 1) , left=0,top=0,right=width,bottom=height
*/
HGEXPORT HGResult HGAPI HGBase_ResetImageROI(HGImage image);
/* 获取图像DPI
* :
* 1) image: in,
* 2) xDpi: out, xdpi
* 3) yDpi: out, ydpi
* :
*/
HGEXPORT HGResult HGAPI HGBase_GetImageDpi(HGImage image, HGUInt *xDpi, HGUInt* yDpi);
/* 设置图像DPI
* :
* 1) image: in,
* 2) xDpi: in, xdpi
* 3) yDpi: in, ydpi
* :
*/
HGEXPORT HGResult HGAPI HGBase_SetImageDpi(HGImage image, HGUInt xDpi, HGUInt yDpi);
#if defined(HG_CMP_MSC)
/* 获取图像内部的DIB位图句柄
* :
* 1) image: in,
* 2) hBmp: out, DIB位图句柄
* :
* 1) windows平台有效
* 2) HBITMAP不能用DeleteObject销毁
*/
HGEXPORT HGResult HGAPI HGBase_GetHBITMAPOfImage(HGImage image, HBITMAP *hBmp);
/* 创建DIB位图
* :
* 1) image: in,
* 2) hBmp: out, DIB位图句柄
* :
* 1) windows平台有效
* 2) hBmp必须用DeleteObject销毁
* 3) ROI区域
* 4) HGBASE_IMGTYPE_RGB会自动转为BGR排列, HGBASE_IMGTYPE_RGBA会自动转为BGRA排列
*/
HGEXPORT HGResult HGAPI HGBase_CreateHBITMAPFromImage(HGImage image, HBITMAP* hBmp);
/* 创建DIB内存
* :
* 1) image: in,
* 2) hMem: out, DIB内存句柄
* :
* 1) windows平台有效
* 2) hMem必须用GlobalFree销毁
* 3) ROI区域
* 4) HGBASE_IMGTYPE_RGB会自动转为BGR排列, HGBASE_IMGTYPE_RGBA会自动转为BGRA排列
*/
HGEXPORT HGResult HGAPI HGBase_CreateDIBFromImage(HGImage image, HGLOBAL* hMem);
#endif /* HG_CMP_MSC */
/* 图像左右镜像
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageMirror(HGImage image, HGImage destImage);
/* 图像上下镜像
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageFlip(HGImage image, HGImage destImage);
/* 图像左转
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须宽高互反
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage不能是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageRotateLeft(HGImage image, HGImage destImage);
/* 图像右转
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须宽高互反
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage不能是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageRotateRight(HGImage image, HGImage destImage);
/* 图像左转后再左右镜像
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须宽高互反
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage不能是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageRotateLeftMirror(HGImage image, HGImage destImage);
/* 图像右转后再左右镜像
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须宽高互反
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage不能是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageRotateRightMirror(HGImage image, HGImage destImage);
/* 图像旋转180度
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageRotate180(HGImage image, HGImage destImage);
/* 图像灰度化
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ImageGrayscale(HGImage image, HGImage destImage);
/* 图像反色
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type必须一样
* 3) origon不一致的情况
* 4) image和destImage可以是同一个句柄
*/
HGEXPORT HGResult HGAPI HGBase_ReverseImage(HGImage image, HGImage destImage);
/* 拷贝图像
* :
* 1) image: in,
* 2) destImage: in,
* :
* 1) ROI区域, ROI大小必须一样
* 2) type不一致的情况
* 3) origin不一致的情况
* 4) image和destImage不能是同一个图像句柄
2022-05-03 10:25:52 +00:00
*/
HGEXPORT HGResult HGAPI HGBase_CopyImage(HGImage image, HGImage destImage);
#endif /* __HGIMAGE_H__ */