• ベストアンサー

VB2005での画像処理

各ピクセルの色情報を取得し,そのままコピーするプログラムです. 同じ大きさのPictureBox1とPictureBox2,それとButton1があります. エラーや警告は出ませんが,Button1をクリックしてもまったく動きません. 最終的にはPictureBox1を画像処理してPictureBox2に結果を表示させたいのですが,そのままコピーも出来ないため原因を探しています. A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) ではだめなのでしょうか.ご教授ください. -----以下プログラム------ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim j As Integer Dim A As Integer Dim picture1 As New Bitmap(PictureBox1.Image) Dim picture2 As New Bitmap(PictureBox2.Image) For j = 0 To PictureBox1.Width - 1 For i = 0 To PictureBox1.Height - 1 A = picture1.GetPixel(i, j).ToArgb() picture2.SetPixel(i, j, color.FromArgb(A)) Next Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

すでに#1 edp3142さんが問題点を指摘されているので横槍気味で恐縮です。 惜しいところまでコーディングできていたので・・・。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i As Integer Dim j As Integer Dim A As Integer Dim picture1 As New Bitmap(PictureBox1.Image) Dim picture2 As New Bitmap(picture1.Width, picture1.Height, Imaging.PixelFormat.Format24bppRgb)   For i = 0 To picture1.Width - 1     For j = 0 To picture1.Height - 1       A = picture1.GetPixel(i, j).ToArgb()       picture2.SetPixel(i, j, Color.FromArgb(A))     Next   Next PictureBox2.Image = picture2 End Sub Forループのiとjが逆っぽかったので入れ替えました。 ちなみにGetPixelとSetPixelは非常に動作が遅いので大きな画像を1ピクセル単位で処理する場合にはえらく時間がかかります。 この先の高速化をお考えであれば、BitmapクラスのLockBits/UnlockBitsメソッドについて調べてみてください。

Akanzasi
質問者

お礼

丁寧にご教授くださりありがとうございます. おかげさまでコピーのところまで出来ました. iとj逆でした.ご指摘ありがとうございます.

Akanzasi
質問者

補足

追加で質問なのですが, 画像を暗くするためにA=Amax*(A/Amax)^2の式を使ったのですが, 赤っぽいノイズが入ってしまいます. GetPixelの戻り値をそのまま使ってはダメなのでしょうか.

その他の回答 (1)

noname#259269
noname#259269
回答No.1

Bitmapを(PictureBoxの画像を元に)新規作成し、Bitmapに対して書き込んでいるだけですので、画面に変化がなくて当然ですね。 処理結果をPictureBoxに再設定しなくては。。。 picture2 を SaveAs メソッドでファイルに保存し、それをエクスプローラで開いてみれば、処理できているかわかるのではないでしょうか。

Akanzasi
質問者

お礼

ありがとうございました. おかげさまで画像のコピーできました.