1.HGBase增加获取像素值的接口

2.解决图像预览窗口颜色值显示不准确的问题
This commit is contained in:
luoliangyi 2023-11-28 15:41:48 +08:00
parent f9dae37fae
commit 2c12f05517
4 changed files with 128 additions and 27 deletions

View File

@ -1465,18 +1465,12 @@ void HGImgView::mouseMoveEvent(QMouseEvent* e)
if (m_showColorInfo)
{
HGByte *data = nullptr;
HGBase_GetImageData(m_image, &data);
HGByte *pixel = data + yImg * info.widthStep + xImg * 3;
HGByte r = pixel[0];
HGByte g = pixel[1];
HGByte b = pixel[2];
//qDebug("colorInfo, r=%d, g=%d, b=%d", r, g, b);
HGImagePixel pixel;
HGBase_GetImagePixel(m_image, xImg, yImg, &pixel);
char colorInfo[1024];
sprintf(colorInfo, "X: %d, Y: %d\nRGB(%d, %d, %d)\nHTML(#%02X%02X%02X)",
xImg, yImg, r, g, b, r, g, b);
xImg, yImg, pixel.r, pixel.g, pixel.b, pixel.r, pixel.g, pixel.b);
QToolTip::showText(e->globalPos(), colorInfo, this);
}
}

View File

@ -108,6 +108,7 @@ HGBase_CloneImage
HGBase_DestroyImage
HGBase_GetImageData
HGBase_GetImageInfo
HGBase_GetImagePixel
HGBase_GetImageROI
HGBase_SetImageROI
HGBase_ResetImageROI

View File

@ -798,6 +798,117 @@ HGResult HGAPI HGBase_GetImageInfo(HGImage image, HGImageInfo* info)
return HGBASE_ERR_OK;
}
static inline HGByte GetBit(const HGByte* data, HGUInt index)
{
HGUInt byteIndex = index / 8;
HGUInt bitIndex = index % 8;
return (data[byteIndex] >> (7 - bitIndex)) & 0x01;
}
static inline void SetBit(HGByte* data, HGUInt index, HGByte value)
{
assert(0 == value || 1 == value);
HGUInt byteIndex = index / 8;
HGUInt bitIndex = index % 8;
if (1 == value)
data[byteIndex] |= (1 << (7 - bitIndex));
else
data[byteIndex] &= ~(1 << (7 - bitIndex));
}
HGResult HGAPI HGBase_GetImagePixel(HGImage image, HGUInt x, HGUInt y, HGImagePixel *pixel)
{
if (NULL == image || NULL == pixel)
{
return HGBASE_ERR_INVALIDARG;
}
HGImageImpl* imageImpl = (HGImageImpl*)image;
HGUInt width = imageImpl->m_width;
HGUInt height = imageImpl->m_height;
HGUInt type = imageImpl->m_type;
HGUInt widthStep = imageImpl->m_widthStep;
HGUInt origin = imageImpl->m_origin;
HGByte* data = imageImpl->m_data;
if (x >= width || y >= height)
{
return HGBASE_ERR_INVALIDARG;
}
if (HGBASE_IMGTYPE_BINARY == type)
{
HGByte *p = data + y * widthStep;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep;
HGByte v = GetBit(p, x) * 255;
pixel->r = v;
pixel->g = v;
pixel->b = v;
pixel->a = 0;
}
else if (HGBASE_IMGTYPE_GRAY == type)
{
HGByte *p = data + y * widthStep + x;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep + x;
pixel->r = p[0];
pixel->g = p[0];
pixel->b = p[0];
pixel->a = 0;
}
else if (HGBASE_IMGTYPE_BGR == type)
{
HGByte *p = data + y * widthStep + x * 3;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep + x * 3;
pixel->r = p[2];
pixel->g = p[1];
pixel->b = p[0];
pixel->a = 0;
}
else if (HGBASE_IMGTYPE_RGB == type)
{
HGByte *p = data + y * widthStep + x * 3;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep + x * 3;
pixel->r = p[0];
pixel->g = p[1];
pixel->b = p[2];
pixel->a = 0;
}
else if (HGBASE_IMGTYPE_BGRA == type)
{
HGByte *p = data + y * widthStep + x * 4;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep + x * 4;
pixel->r = p[2];
pixel->g = p[1];
pixel->b = p[0];
pixel->a = p[3];
}
else
{
assert(HGBASE_IMGTYPE_RGBA == type);
HGByte *p = data + y * widthStep + x * 4;
if (HGBASE_IMGORIGIN_BOTTOM == origin)
p = data + (height - y - 1) * widthStep + x * 4;
pixel->r = p[0];
pixel->g = p[1];
pixel->b = p[2];
pixel->a = p[3];
}
return HGBASE_ERR_OK;
}
HGResult HGAPI HGBase_GetImageROI(HGImage image, HGImageRoi* roi)
{
if (NULL == image || NULL == roi)
@ -2892,24 +3003,6 @@ HGResult HGAPI HGBase_ReverseImage(HGImage image, HGImage destImage)
return HGBASE_ERR_OK;
}
static inline HGByte GetBit(const HGByte* data, HGUInt index)
{
HGUInt byteIndex = index / 8;
HGUInt bitIndex = index % 8;
return (data[byteIndex] >> (7 - bitIndex)) & 0x01;
}
static inline void SetBit(HGByte* data, HGUInt index, HGByte value)
{
assert(0 == value || 1 == value);
HGUInt byteIndex = index / 8;
HGUInt bitIndex = index % 8;
if (1 == value)
data[byteIndex] |= (1 << (7 - bitIndex));
else
data[byteIndex] &= ~(1 << (7 - bitIndex));
}
static HGResult CopyImageWithBinary(HGImageImpl *srcImageImpl, HGImageImpl *destImageImpl)
{
assert(HGBASE_IMGTYPE_BINARY == srcImageImpl->m_type

View File

@ -43,6 +43,15 @@ typedef struct
HGUInt origin; /* 数据排列方式参见HGBASE_IMGORIGIN_* */
}HGImageInfo;
/* 图像像素 */
typedef struct
{
HGByte r;
HGByte g;
HGByte b;
HGByte a;
}HGImagePixel;
/* 图像感兴趣区域 */
typedef struct
{
@ -205,6 +214,10 @@ HGEXPORT HGResult HGAPI HGBase_GetImageData(HGImage image, HGByte** data);
*/
HGEXPORT HGResult HGAPI HGBase_GetImageInfo(HGImage image, HGImageInfo* info);
/* 获取图像像素值
*/
HGEXPORT HGResult HGAPI HGBase_GetImagePixel(HGImage image, HGUInt x, HGUInt y, HGImagePixel *pixel);
/* 获取图像感兴趣区域
* :
* 1) image: in,