1

私は Visual Basic が初めてで、過去に matlab で画像処理を行ったことがあります。ただし、現時点では Visual Basic での画像処理が必要です。さて、私は画像を表示し、グレースケールへの変換について読むことができました。ただし、私の画像は jpeg 形式であり、いくつかのグレースケール コンバーター チュートリアルで bmp 画像のみのビットマップ関数を実行し続け、コードは JPEG 形式の操作でエラーを生成し続けます。jpeg を読み込んでグレースケール操作を実行するにはどうすればよいですか。これがコードです。

Public Class Form1
Private Sub showButton_Click(sender As System.Object, e As System.EventArgs) Handles showButton.Click
    ' Show the Open File dialog. If the user clicks OK, load the
    ' picture that the user chose.
    If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
        PictureBox1.Load(OpenFileDialog1.FileName)
    End If
End Sub

Private Sub GrayImageButton_Click(sender As System.Object, e As System.EventArgs) Handles GrayImageButton.Click
 Dim bm As New jpeg(PictureBox1.Image)
    Dim X As Integer
    Dim Y As Integer
    Dim clr As Integer

    For X = 0 To bm.Width - 1
        For Y = 0 To bm.Height - 1
            clr = (CInt(bm.GetPixel(X, Y).R) + _
                   bm.GetPixel(X, Y).G + _
                   bm.GetPixel(X, Y).B) \ 3
            bm.SetPixel(X, Y, Color.FromArgb(clr, clr, clr))
        Next Y
    Next X
    PictureBox1.Image = bm
End Sub

私が受け取っているエラーは

エラー 1 : 'WindowsApplication1.jpeg' 型の値を 'System.Drawing.Image' に変換できません。

これを bmp 画像で実装すると、完全に機能しますが、jpeg では機能しません。この問題について何か助けていただければ幸いです。ありがとう

4

5 に答える 5

2

変更するだけです:

Dim bm As New jpeg(PictureBox1.Image)

に:

Dim bm As New Bitmap(PictureBox1.Image)

ただし、次のように ColorMatrix を使用する方が高速です。

Private Sub GrayImageButton_Click(sender As System.Object, e As System.EventArgs) Handles GrayImageButton.Click
    Dim grayscale As New Imaging.ColorMatrix(New Single()() _
        { _
            New Single() {0.299, 0.299, 0.299, 0, 0}, _
            New Single() {0.587, 0.587, 0.587, 0, 0}, _
            New Single() {0.114, 0.114, 0.114, 0, 0}, _
            New Single() {0, 0, 0, 1, 0}, _
            New Single() {0, 0, 0, 0, 1} _
        })

    Dim bmp As New Bitmap(PictureBox1.Image)
    Dim imgattr As New Imaging.ImageAttributes()
    imgattr.SetColorMatrix(grayscale)
    Using g As Graphics = Graphics.FromImage(bmp)
        g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), _
                    0, 0, bmp.Width, bmp.Height, _
                    GraphicsUnit.Pixel, imgattr)
    End Using
    PictureBox1.Image = bmp
End Sub
于 2013-06-20T15:14:46.383 に答える
0

jpegvb.netのようなタイプはないので、次の行:

Dim bm As New jpeg(PictureBox1.Image) 

に置き換える必要があります

Dim bm as Bitmap = New Bitmap(PictureBox1.image)
于 2013-06-20T15:15:25.157 に答える
0

jpegはどこで定義されていますか? それはあなたが使用している VB.Net ライブラリですか? または、このオブジェクトを自分で作成しましたか?

.Net には組み込みの Jpeg ユーティリティがいくつかあります。これをチェックしてみてください。

http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.jpegbitmapdecoder.aspx

これにより、ピクセルにアクセスできるはずです。そこから、色操作のバックグラウンドにより、これを使用して、探していることを正確に実行できるようになります。

于 2013-06-20T15:00:41.013 に答える
0

AForge や OpenCV などのイメージング ライブラリを検討することをお勧めします。多くの便利な機能が組み込まれています (たとえば、いくつかの異なる RGB からグレースケールへのアルゴリズム)。OpenCV は C++ で記述されているため、おそらく VB で記述できるものよりも高速になります。AForge についてはよくわかりませんが、C# で書かれていると思います。

于 2013-06-20T15:04:06.980 に答える
-2

ここに良いコードがあります

Sub BlackAndWhite() Dim x As Integer Dim y As Integer Dim red As Byte Dim green As Byte Dim blue As Byte For x = 0 To I.Width - 1 For y = 0 To I.Height - 1 red = I.GetPixel( x, y).R green = I.GetPixel(x, y).G blue = I.GetPixel(x, y).B I.SetPixel(x, y, Color.FromArgb(blue, blue, blue)) 次へNext PictureBox1.Image = I End Sub

于 2014-06-18T03:10:47.383 に答える