2013-06-20 3 views
1

Я новичок в Visual Basic, в прошлом я занимался обработкой изображений в Matlab. Но на данный момент требуется обработка изображений в Visual Basic. Хорошо, я смог отобразить изображение и прочитать его при преобразовании в оттенки серого. Однако мое изображение находится в формате jpeg, и я продолжаю работать в функции Bitmap только для изображений BMP в нескольких учебниках по конвертерам оттенков серого, и мой код продолжает создавать ошибки для попыток манипуляции с форматом JPEG. Как читать в jpeg и выполнять манипуляции с оттенками серого. Вот код.Преобразование RGB в шкалу серого?

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 

Ошибка Я ПОЛУЧАТЬ является

Error1: Значение типа 'WindowsApplication1.jpeg' не может быть преобразован в 'System.Drawing.Image'.

Когда я реализую это с изображением BMP, он отлично работает, но не с jpeg. Буду благодарен за любую помощь в этом вопросе. Thanks

ответ

0

Где jpeg определяется? Это библиотека VB.Net, которую вы используете? Или вы сами написали этот объект?

.Net имеет некоторые встроенные утилиты Jpeg, вы можете проверить это:

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

При этом вы должны быть в состоянии получить доступ к пикселям, оттуда фона в манипуляции цвета должны позволяют вам использовать это, чтобы делать именно то, что вы хотите сделать.

+0

, чтобы отобразить растровое изображение, код был в этом формате –

+0

Чтобы отобразить растровое изображение, код был в этом формате как показано выше, но для второй части вышеприведенного кода с размером Dim, я заменяю jpeg и используемый Bitmap, и он работал для изображений BMP. Так что я посетил сайт, как я понял, второй файл исходного кода на этой странице преобразует jpeg, чтобы он мог быть совместим с визуальным базовым. Спасибо –

0

Я бы предложил посмотреть библиотеку изображений, такую ​​как AForge или OpenCV. У них есть много полезных функций, встроенных (например, несколько различных алгоритмов RGB-Grayscale). OpenCV написан на C++, поэтому он, вероятно, будет быстрее, чем все, что вы можете написать в VB. Я не уверен в AForge, но я думаю, что это написано на C#.

+0

К сожалению, сэр, я незнаком с C++. Это предварительная подготовка для школьной лаборатории, и руководитель лаборатории знаком с Visual Basic для обработки изображений, а не для Matlab. Таким образом, у меня есть все, что мне нужно в Matlab, но не в VB. Как инженер-майор, я занимался только Matlab и некоторое время назад. –

+0

Вам не нужно знать C++. Вы просто импортируете DLL OpenCV и вызываете ее из VB. –

2

Просто изменение:

Dim bm As New jpeg(PictureBox1.Image) 

To:

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 
0

Там нет такого введите jpeg в vb.net, так что строка:

Dim bm As New jpeg(PictureBox1.Image) 

следует заменить

Dim bm as Bitmap = New Bitmap(PictureBox1.image) 
-1

Вот хороший код

Sub BlackAndWhite() Dim х As Integer Dim у As Integer тусклый красный As Byte Dim зеленый As Byte Dim blue As Byte Для x = 0 To I.Width - 1 Для y = 0 To I.Height - 1 red = I.GetPixel (x, y) .R green = I.GetPixel (x, y) .G синий = I.GetPixel (x, y) .B I.SetPixel (x, y, цвет.FromArgb (синий, синий, синий)) Далее Далее PictureBox1.Image = I End Sub