光道視覺科技股份有限公司
關於我們 最新消息 產品介紹 下載專區 技術問題 聯絡我們
Sitemap 回首頁 繁體中文 English
技術問題

[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

Copyright ©2008 Internet Service by
AISYS Vison company.