From 2c12f05517c4c2c1172d29bf38e4c8b57be1cab1 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Tue, 28 Nov 2023 15:41:48 +0800 Subject: [PATCH] =?UTF-8?q?1.HGBase=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=83=8F=E7=B4=A0=E5=80=BC=E7=9A=84=E6=8E=A5=E5=8F=A3=202.?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9B=BE=E5=83=8F=E9=A2=84=E8=A7=88=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E9=A2=9C=E8=89=B2=E5=80=BC=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/scanner2/HGImgView.cpp | 12 +--- build2/qt/HGBase/HGBase.def | 1 + modules/base/HGImage.cpp | 129 +++++++++++++++++++++++++++++++----- modules/base/HGImage.h | 13 ++++ 4 files changed, 128 insertions(+), 27 deletions(-) diff --git a/app/scanner2/HGImgView.cpp b/app/scanner2/HGImgView.cpp index b4e04e87..e704de97 100644 --- a/app/scanner2/HGImgView.cpp +++ b/app/scanner2/HGImgView.cpp @@ -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); } } diff --git a/build2/qt/HGBase/HGBase.def b/build2/qt/HGBase/HGBase.def index 5b77ac00..63a4090d 100644 --- a/build2/qt/HGBase/HGBase.def +++ b/build2/qt/HGBase/HGBase.def @@ -108,6 +108,7 @@ HGBase_CloneImage HGBase_DestroyImage HGBase_GetImageData HGBase_GetImageInfo +HGBase_GetImagePixel HGBase_GetImageROI HGBase_SetImageROI HGBase_ResetImageROI diff --git a/modules/base/HGImage.cpp b/modules/base/HGImage.cpp index 511a7609..ac23a90f 100644 --- a/modules/base/HGImage.cpp +++ b/modules/base/HGImage.cpp @@ -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 diff --git a/modules/base/HGImage.h b/modules/base/HGImage.h index cb4a2bde..96bbd07d 100644 --- a/modules/base/HGImage.h +++ b/modules/base/HGImage.h @@ -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, 图像句柄