VB初心者ですがよろしくお願いします。
VB6.0を使用
対象とする画像(BMP)から全てのピクセルのRGB値を抽出したいと思っています。
画像が640×480程度サイズなら画像をPictureBoxに表示させ、.point(x,y)でRGB値を抽出できたのできるのですが、画面に表示できないほどの大きさになると読み取ることができなくなってしまいました。
このような場合どのようにすれば各ピクセルのRGB値を抽出することができるでしょうか。
BMPファイルならファイルフォーマットを解析すれば
色が分かるよ
BMP ファイルフォーマット
http://www.kk.iij4u.or.jp/~kondo/bmp/
画面上の色を取得するのではなく、メモリ上の画像を
取得するWin32API GetPixel関数を使うといいかも
またはBMPファイルフォーマットを解析して指定の色を取得する
やじゅさん回答ありがとうございます。
早速ファイルフォーマット解析とWin32API GetPixel関数の両方で試してみたいと思います。
Win32API GetPixel関数の方でまずは試してみました。
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Sub mopen_Click()
Set File1 = CreateObject("mscomdlg.commondialog")
File1.Filter = "画像(*.bmp)|*.bmp"
File1.ShowOpen
Picture1.Picture = LoadPicture(File1.FileName)
test = Picture1.hdc
End Sub
Private Sub Command1_Click()
A = GetPixel(test, 1000, 1000)
Text1.SelText = A
End Sub
としましたが動作しませんでした。
A = GetPixel(test, 100, 100)
とすると動作してくれるのですが・・・。
何か定義が間違っているのでしょうか?
一点のピクセルだけを求めるならVB の pointメソッドや API の GetPixel でも充分ですが、全体のピクセルを求めるにはそれらでは異常に遅いので、高速に処理したいときは GDI を使う方法があります。
ここにサンプルがあります。
画像処理の高速化
http://www5a.biglobe.ne.jp/~suuta/vb/kousokuka.html
>A = GetPixel(test, 1000, 1000)
Picture1のサイズは? 1000ピクセル × 1000ピクセル より小さいのでは。
(ScaleMode に注意、通常は、Twip API関数では、ピクセルになります)
エラーメッセージは表示していませんか?
> 画面に表示できないほどの大きさになると読み取ることができなくなってしまいました。
ちなみに、前もって
Picture1.AutoRedraw = True
としておけば、.point(x,y)でも、画面からはみ出した範囲の色を読み込めます。
対象としている画像のサイズが 6400×4800 だったので、
Picture1.AutoRedraw = Trueとする事で画面からはみ出したピクセルのRGB値を抽出できました。
次は処理の高速化のためGDIを使ってみようと思います。
みなさまありがとうございました。