Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Слияние двух изображений


Автор: jennya 9.11.2009, 20:56
Помогите пожайлуста кто-нибудь, целый месяц уже бьюсь не могу разобраться программой на Vusial Basic 2005 для слияния двух изображений. У меня при компеляции появляется ошибка: Image is not a member of MergedImage/ Подскажите пожалуйста как исправить данную ошибку, программа приведена ниже:
Код

Public Class Form1
    Private SourceImages(1) As Bitmap
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim counter As Integer
        Dim locateFile As New OpenFileDialog
        Me.Show()
        locateFile.Filter = "JPG files (*.jpg)|*.jpg"
        For counter = 0 To 1
            If (locateFile.ShowDialog() <> Windows.Forms.DialogResult.OK) Then
                Me.Close()
                Return
            End If
            SourceImages(counter) = New Bitmap(locateFile.FileName)
        Next counter
        DoMergeImages()
    End Sub

    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        End
    End Sub
    Private Sub DoMergeImages()
        Dim workBitmap As Bitmap
        Dim across As Integer
        Dim down As Integer
        Dim firstColor As Color
        Dim secondColor As Color
        Dim mixedColor As Color
        Dim redPart As Integer
        Dim greenPart As Integer
        Dim bluePart As Integer
        Dim canvas As Graphics
        workBitmap = SourceImages(0)
        canvas = Graphics.FromImage(workBitmap)
        For down = 0 To SourceImages(0).Height - 1
            For across = 0 To SourceImages(0).Width - 1
                Try
                    firstColor = SourceImages(0).GetPixel(across, down)
                    secondColor = SourceImages(1).GetPixel(across, down)
                Catch
                    Continue For
                End Try
                redPart = (CInt(firstColor.R) + secondColor.R) \ 2
                greenPart = (CInt(firstColor.G) + secondColor.G) \ 2
                bluePart = (CInt(firstColor.B) + secondColor.B) \ 2
                mixedColor = Color.FromArgb(redPart, greenPart, bluePart)
                workBitmap.SetPixel(across, down, mixedColor)
            Next across
            MergedImage.Image = workBitmap
            Application.DoEvents()
        Next down
        canvas.Dispose()
    End Sub
End Class


Автор: Pilger 9.11.2009, 21:31
Ты однако вопрос по адресу задал.
1. Создай тему с вопросом
2. Пользуйся меткой кода

Автор: diadiavova 9.11.2009, 23:28
Pilger, thx smile 
jennya, сообщение означает
Image не является членом MergedImage
Что-то добавить к этому трудно, поскольку из кода не видно какого типа у тебя MergedImage и где эта переменная объявлена(по крайней мере я не нашёл). На человеческом языке это значит, что у того типа, к которому принадлежит эта переменная(если это переменная) нент такого члена как Image, а ты пытаешься его вызвать.

Автор: jennya 10.11.2009, 18:48
АКаким типом переменой можно объявить MergedImage ? smile 

Автор: diadiavova 10.11.2009, 20:29
Цитата(jennya @  10.11.2009,  18:48 Найти цитируемый пост)
АКаким типом переменой можно объявить MergedImage ? 

Ты вообще не в ту сторону копаешь. Во-первых что это вообще за объект? Во вторых твою задачу проще будет решить если ты создашь для её решения отдельную функцию. Примерно так
Код

Function MergeBitmaps(ByVal bm1 As Bitmap, ByVal bm2 As Bitmap) As Bitmap
    If bm1.Size <> bm2.Size Then
        Throw New Exception("Несовпадение размеров изображений")
    End If
    MergeBitmaps = New Bitmap(bm1.Width, bm1.Height)
    For r = 0 To bm1.Height - 1
        For c = 0 To bm1.Width - 1
            Dim newColor = MergeColors(bm1.GetPixel(c, r), bm2.GetPixel(c, r))
            MergeBitmaps.SetPixel( c, r,  newColor)
        Next
    Next
End Function

Function MergeColors(ByVal c1 As Color, ByVal c2 As Color) As Color

End Function

А в функции MergeColors пропиши код слияния цветов. Таким образом первая функция будет принимать две картинки, а возвращать результат слияния(если они одного размера).

Автор: jennya 10.11.2009, 21:28
Спасибо! А какой именно код?

Автор: diadiavova 10.11.2009, 21:35
Цитата(jennya @  10.11.2009,  21:28 Найти цитируемый пост)
Спасибо! А какой именно код? 

В смысле? Если ты о коде слияния цветов, то это твоя задача. Я не знаю, что ты под слиянием понимаешь. Если судить по первому примеру, то вычисляй среднюю величину для каждого компонента цвета.
Код

Function MergeColors(ByVal c1 As Color, ByVal c2 As Color) As Color
    Dim aver = Function(x, y) CInt((x + y) / 2 )
    With MergeColors
        .R = aver(c1.R, c2.R )
        .G = aver(c1.G, c2.G )
        .B = aver(c1.B, c2.B ) 
   End With
End Function
Вот как-то так

Автор: jennya 12.11.2009, 01:11
Спасибо громадное, сейчас попробую.

Автор: jennya 13.11.2009, 17:48
Спасибо за ценный совет. Все оказалось проще. Нужно добавить на форму элемент PictureBox и назвать его MergedImage. Порграмма корректно работает если загружать картинки одинаковых размеров. Но возник другой вопрос как изменить програмный код, чтобы можно было добавлять неограниченное количество рисунков. Подскажите пожайлуста кто-нибудь.

Автор: diadiavova 13.11.2009, 17:55
Цитата(jennya @  13.11.2009,  17:48 Найти цитируемый пост)
как изменить програмный код, чтобы можно было добавлять неограниченное количество рисунков. 
Куда добавлять? Опять мысли читать надо? Сформулируй свою задачу так, чтобы тебя можно было понять. По первому вопросу я только сейчас понял, что ты откуда-то скопипастил код, не прочитав инструкцию к нему. Опиши конкретно, что должна делать твоя программа.

Автор: jennya 13.11.2009, 18:10
Я не правильно задал вопрос как написать программу для вывода картинок в слайд-шоу?

Автор: diadiavova 13.11.2009, 18:19
Цитата(jennya @  13.11.2009,  18:10 Найти цитируемый пост)
Я не правильно задал вопрос как написать программу для вывода картинок в слайд-шоу? 

Ну например можно картинки забить в массив, а в пикчербоксе для отображения следующей картинки просто присваивай его свойству Image нужное значение.

Автор: jennya 13.11.2009, 22:19
Нужно было написать программу, в которую можно помести одно изображение с меньшей интенсивностью, поверх другого с большей интнесивностью, чтобы создать эффект приведения. Что касается вывода картинок в виде слайд -шоу , то данный код для этого не подходит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)