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

我建议查看像 AForge 或 OpenCV 这样的成像库。它们内置了许多有用的功能(例如,几种不同的 RGB 到灰度算法)。OpenCV 是用 C++ 编写的,因此它可能比用 VB 编写的任何东西都要快。我不确定 AForge,但我认为它是用 C# 编写的。

于 2013-06-20T15:04:06.980 回答
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

没有像jpegvb.net 这样的类型,所以该行:

Dim bm As New jpeg(PictureBox1.Image) 

应该替换为

Dim bm as Bitmap = New Bitmap(PictureBox1.image)
于 2013-06-20T15:15:25.157 回答
-2

这是一个很好的代码

Sub BlackAndWhite() 暗 x 为整数 暗 y 为整数 暗红色为字节 暗绿色为字节 暗蓝色 为字节 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 回答