GetDIBitsで指定範囲のRGB値を点単位で抜き出すってことはできますでしょうか?
GetPixelではできたのですが、処理速度が遅いと聞きました。
できるものなら、速い方法で処理したいと思いましたので。。
よろしくお願いします。
GetDIBitsからRGB
なおなお
文章が不足していると思われますので、補足します。
過去ログの"デスクトップの画像をBMPに"から引用させていただいて。。
'デスクトップのデバイスコンテキスト
Dim hDesktopDC As DWord
'メモリ上のビットマップ
Dim hBmpDC As DWord
Dim hBmp As DWord
'スクリーンのサイズ
Dim x As Long, y As Long
'ファイル書き込み時
Dim hFile As DWord
Dim WriteSize As DWord
'ビットマップの構成データ
Dim BmpBits As DWord
Dim bfh As BITMAPFILEHEADER
Dim bi As BITMAPINFO
Dim BM[1] As Byte
'スクリーンの大きさを取得
x = GetSystemMetrics( SM_CXSCREEN)
y = GetSystemMetrics( SM_CYSCREEN)
'デスクトップ画面のデバイスコンテキスト取得
hDesktopDC = GetDC( GetDesktopWindow())
'メモリ上にビットマップを作る
hBmpDC = CreateCompatibleDC( hDesktopDC)
hBmp = CreateCompatibleBitmap( hDesktopDC, x, y)
SelectObject( hBmpDC, hBmp)
'デスクトップの画面をメモリ上のビットマップにコピー
BitBlt( hBmpDC, 0, 0, x, y, hDesktopDC, 0, 0, SRCCOPY)
'ビットマップの情報とビットデータを取得
bi.bmiHeader.biSize = 40
bi.bmiHeader.biWidth = x
bi.bmiHeader.biHeight = y
bi.bmiHeader.biPlanes = 1
bi.bmiHeader.biBitCount = 24
bi.bmiHeader.biCompression = 0
bi.bmiHeader.biSizeImage = x*y*3
BmpBits = calloc( bi.bmiHeader.biSizeImage)
GetDIBits( hBmpDC, hBmp, 0, y, BmpBits, bi, 0)
'ヘッダのセット
lstrcpy( BM, "BM")
memcpy( VarPtr(bfh.bfType), BM, 2)
bfh.bfSize = bi.bmiHeader.biSizeImage + 54
bfh.bfOffBits = 54
'書き込み
hFile = CreateFile( "C:\desktop.bmp", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
WriteFile( hFile, VarPtr( bfh), 14, VarPtr( WriteSize), ByVal 0)
WriteFile( hFile, VarPtr( bi), 40, VarPtr( WriteSize), ByVal 0)
WriteFile( hFile, BmpBits, bfh.bfSize, VarPtr( WriteSize), ByVal 0)
CloseHandle( hFile)
'ビットデータを開放
free( BmpBits)
'デバイスコンテキスト破棄
ReleaseDC( GetDesktopWindow(), hDesktopDC)
DeleteDC( hBmpDC)
DeleteObject( hBmp)
-------------------------------------------------------------------
上記プログラムの”BmpBits”の中にRGBが入ってる?と思ってるのですが。。
ここから、1点のRGBを求めたいのです(実際は複数点ですが)
よろしくお願いします。
過去ログの"デスクトップの画像をBMPに"から引用させていただいて。。
'デスクトップのデバイスコンテキスト
Dim hDesktopDC As DWord
'メモリ上のビットマップ
Dim hBmpDC As DWord
Dim hBmp As DWord
'スクリーンのサイズ
Dim x As Long, y As Long
'ファイル書き込み時
Dim hFile As DWord
Dim WriteSize As DWord
'ビットマップの構成データ
Dim BmpBits As DWord
Dim bfh As BITMAPFILEHEADER
Dim bi As BITMAPINFO
Dim BM[1] As Byte
'スクリーンの大きさを取得
x = GetSystemMetrics( SM_CXSCREEN)
y = GetSystemMetrics( SM_CYSCREEN)
'デスクトップ画面のデバイスコンテキスト取得
hDesktopDC = GetDC( GetDesktopWindow())
'メモリ上にビットマップを作る
hBmpDC = CreateCompatibleDC( hDesktopDC)
hBmp = CreateCompatibleBitmap( hDesktopDC, x, y)
SelectObject( hBmpDC, hBmp)
'デスクトップの画面をメモリ上のビットマップにコピー
BitBlt( hBmpDC, 0, 0, x, y, hDesktopDC, 0, 0, SRCCOPY)
'ビットマップの情報とビットデータを取得
bi.bmiHeader.biSize = 40
bi.bmiHeader.biWidth = x
bi.bmiHeader.biHeight = y
bi.bmiHeader.biPlanes = 1
bi.bmiHeader.biBitCount = 24
bi.bmiHeader.biCompression = 0
bi.bmiHeader.biSizeImage = x*y*3
BmpBits = calloc( bi.bmiHeader.biSizeImage)
GetDIBits( hBmpDC, hBmp, 0, y, BmpBits, bi, 0)
'ヘッダのセット
lstrcpy( BM, "BM")
memcpy( VarPtr(bfh.bfType), BM, 2)
bfh.bfSize = bi.bmiHeader.biSizeImage + 54
bfh.bfOffBits = 54
'書き込み
hFile = CreateFile( "C:\desktop.bmp", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
WriteFile( hFile, VarPtr( bfh), 14, VarPtr( WriteSize), ByVal 0)
WriteFile( hFile, VarPtr( bi), 40, VarPtr( WriteSize), ByVal 0)
WriteFile( hFile, BmpBits, bfh.bfSize, VarPtr( WriteSize), ByVal 0)
CloseHandle( hFile)
'ビットデータを開放
free( BmpBits)
'デバイスコンテキスト破棄
ReleaseDC( GetDesktopWindow(), hDesktopDC)
DeleteDC( hBmpDC)
DeleteObject( hBmp)
-------------------------------------------------------------------
上記プログラムの”BmpBits”の中にRGBが入ってる?と思ってるのですが。。
ここから、1点のRGBを求めたいのです(実際は複数点ですが)
よろしくお願いします。