技術問題
[SDK] 如何讀取某個 Pixel 的灰階或是 RGB 值
請參考下圖, 我司彩色影像 (SurfaceHandle) 色彩排列及灰階表示方式

(灰階影像為連續的Pixel資料在此不詳加解釋)
方法1: 直接讀取 PixelValue 資料, 再抽出 R/G/B 灰階值
(請參考 AxImageBW8(灰階) / AxImageC24(全彩) 影像容器說明文件 : AISYS_OVK_Framework_For_Industrial_Manual-TC.chm)
long PixelValue (Long X, Long Y, float ZoomX, float ZoomY, Long PanX, Long PanY); 回傳影像指定位置灰階值
灰階影像範圍值 : 0 ~ 255 (0x00 ~ 0xFF)
全彩影像範圍值 : 0 ~ 16777216 (0x00 ~ 0xFFFFFF)
全彩影像範圍拆解方式 :
RedValue = PixelValue % 256 (求餘數)
GreenValue = ((PixelValue - RedValue) / 256) % 256 (求餘數)
BlueValue = ((PixelValue - GreenValue*256 - RedValue) / 65536) % 256 (求餘數)
方法2: 取得 Pixel 記憶體位址, 轉為 Byte 型態取值
(請參考 AltairU / AxImageBW8 / AxImageC24 說明文件)
long GetImagePtr ( Long SurfaceHandle , int X , int Y ); 取得影像資料在記憶體中的位址
long GetSurfacePtr (Long X,Long Y); 回傳影像資料存放於實體記憶位址
GetImagePtr/GetSurfacePtr 的回傳值是長整數型態, 為此 Pixel 在實體記憶體中的位置,
使用者可以將此位址中的資料強制轉換成(BYTE*)形態來讀取灰階值
以BYTE* 指標接取GetImagePtr回傳值時(以pImage為例)
灰階影像 : pImage[0] 此位置就是(X,Y) 的灰階值.
彩色影像 : pImage[0] 代表(X,Y)的 Blue 灰階值
pImage[1] 代表(X,Y)的 Green 灰階值
pImage[2] 代表(X,Y)的 Red 灰階值
[VB6/VB.net] 使用 kernel32::RtlMoveMemory API 來取得 Ptr 位址內的值 (*reference)
'宣告 CopyMemoryRead 引用 kernel32::RtlMoveMemory
Private Declare Sub CopyMemoryRead Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal Length As Long)
'自訂義 GetPixelValueByLongPtr 涵式
Private Sub GetPixelValueByLongPtr(ByVal ColorDepth As Integer, ByVal lPtr As Long, ByRef R As Integer, ByRef G As Integer, ByRef B As Integer)
'ColorDepth 影像色彩深度
'lPtr 影像記憶體指標位置
'R/G/B 回傳色彩灰階值(灰階影像 R=G=B)
If ColorDepth = 1 Then
CopyMemoryRead B, lPtr, 1
G = B
R = B
Exit Sub
ElseIf ColorDepth = 3 Then
'影像記憶體排列方式 B,G,R
CopyMemoryRead B, lPtr + 0, 1
CopyMemoryRead G, lPtr + 1, 1
CopyMemoryRead R, lPtr + 2, 1
Exit Sub
End If
End Sub