Чтение, запись и сравнение растровых изображений

#vb.net

#vb.net

Вопрос:

A) Когда я записываю BMP-файл, а затем считываю его обратно в другой растровый объект, объекты выглядят по-другому. Похоже, что изменены разрешения по горизонтали и вертикали.

Б) Когда я делаю разрешения растровых объектов одинаковыми, растровые объекты по-прежнему выглядят по-разному, несмотря на то, что все атрибуты выглядят одинаково.

C) Если я дважды прочитаю один и тот же BMP-файл в двух разных растровых объектах, объекты будут выглядеть по-разному.

В конечном итоге я хочу клонировать небольшие разделы более крупного растрового изображения и выяснить, есть ли у меня уже файл для меньшего раздела, сравнивая по очереди содержимое каждого известного ранее сгенерированного файла. То есть, читая каждый файл как растровое изображение, я хочу иметь возможность сравнивать с растровым изображением небольшого раздела.

В конечном итоге я буду указывать контрольную сумму в имени или атрибутах каждого файла для более быстрого исключения, но все равно нужно будет сравнить содержимое каждого файла тех, кто «переживет исключение», чтобы предотвратить разные файлы с одинаковой контрольной суммой. проблема.

При запуске приведенный ниже код показывает проблемы.

 Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
    Dim sFileName As String = "c:TempRed.bmp"

    ' Create red coloured bitmap

    Dim oBitMap1 As New Bitmap(200, 100)
    Dim oGraphics = Graphics.FromImage(oBitMap1)
    oGraphics.FillRectangle(Brushes.Red, 0, 0, 200, 100)

    Dim oBitMapA As New Bitmap(200, 100)
    oBitMapA = oBitMap1
    Debug.Print("oBitMap1 Is oBitMapA = " amp; CStr(oBitMap1 Is oBitMapA))

    ' Save the bitmap

    oBitMap1.Save(sFileName, Imaging.ImageFormat.Bmp)

    ' Read the "same" details back into oBitMap2 amp; BitMap3

    Dim oBitMap2 = New Bitmap(sFileName)
    Dim oBitMap3 = New Bitmap(sFileName)
    'Dim oBitMap2 As Bitmap = Image.FromFile(sFileName)
    'Dim oBitMap3 As Bitmap = Image.FromFile(sFileName)

    ' Show what's what

    Debug.Print("Show whether BitMaps are the same (pre changes)")
    Debug.Print("oBitMap1 Is oBitMap2 = " amp; CStr(oBitMap1 Is oBitMap2))
    Debug.Print("oBitMap2 Is oBitMap3 = " amp; CStr(oBitMap2 Is oBitMap3))
    Debug.Print("Show resolutions (pre any changes)")
    Debug.Print("oBitMap1.Resolution  = " amp; Format(oBitMap1.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap1.VerticalResolution, "##0.###"))
    Debug.Print("oBitMap2.Resolution  = " amp; Format(oBitMap2.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap2.VerticalResolution, "##0.###"))
    Debug.Print("oBitMap3.Resolution  = " amp; Format(oBitMap3.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap3.VerticalResolution, "##0.###"))
    oBitMap2.SetResolution(96, 96)
    oBitMap3.SetResolution(96, 96)
    Debug.Print("Show resolutions (post changes)")
    Debug.Print("oBitMap1.Resolution  = " amp; Format(oBitMap1.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap1.VerticalResolution, "##0.###"))
    Debug.Print("oBitMap2.Resolution  = " amp; Format(oBitMap2.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap2.VerticalResolution, "##0.###"))
    Debug.Print("oBitMap3.Resolution  = " amp; Format(oBitMap3.HorizontalResolution, "##0.###") amp; "," amp; Format(oBitMap3.VerticalResolution, "##0.###"))
    Debug.Print("Show whether BitMaps are the same (post changes)")
    Debug.Print("oBitMap1 Is oBitMap1 = " amp; CStr(oBitMap1 Is oBitMap1))
    Debug.Print("oBitMap1 Is oBitMap2 = " amp; CStr(oBitMap1 Is oBitMap2))
    Debug.Print("oBitMap2 Is oBitMap3 = " amp; CStr(oBitMap2 Is oBitMap3))
End Sub
  

Используя описания выше

A) Я ожидаю, что oBitMap2, прочитанный из файла, созданного из oBitMap1, будет таким же, как oBitMap1, но разрешения разные.

Б) Когда я устанавливаю разрешения oBitMap2 такими же, как у oBitMap1, я ожидаю, что oBitMap1 и oBitmap2 будут одинаковыми, но они разные.

C) Когда я дважды читаю один и тот же файл, я ожидаю, что два созданных растровых изображения (oBitMap2 amp; oBitMap3) будут одинаковыми, но они разные.

Мне интересно, я неправильно понял оператор сравнения «Is» или у растровых изображений есть «скрытые» атрибуты, которые не отображаются, когда я «печатаю» их в отладчике, поскольку все отображаемые атрибуты кажутся одинаковыми.

Комментарии:

1. Это неправильно: Dim oBitMapA As New Bitmap(200, 100) oBitMapA = oBitMap1 . Вы могли бы создать новое растровое изображение, используя оригинал в качестве источника: Dim oBitMapA As New Bitmap(oBitMap1) или клонировать его: Dim oBitMapA As Bitmap = CType(oBitMap1.Clone(), Bitmap) . При создании нового растрового изображения без ссылки по умолчанию используется значение DPI 96 , а PixelFormat — значение PixelFormat.Format32bppArgb .

2. Привет, Джими. Спасибо, что перезвонили мне. Код oBitMap1 и BITMAP был очень простым для тестирования «Is comparative operator». Реальная проблема заключается в том, почему я не могу записать oBitMap1 в файл и прочитать его как то же самое в oBitMap2 плюс, когда я дважды читаю один и тот же файл как oBitMap2 и oBitMap3 почему oBitMap2 и oBitMap3 разные?

3. Когда вы делаете это: oBitMapA = oBitMap1 , вы присваиваете ссылку. Когда вы делаете это: Dim oBitMap2 = New Bitmap(sFileName) , вы создаете новый объект. Исходный файл не соответствует действительности, два объекта не совпадают: разные объекты и разные ссылки. Если вы хотите сравнить растровые изображения, вам нужно сравнить содержимое (если вас интересует физическое равенство). Вы можете преобразовать растровые изображения в массив байтов и использовать [Array].SequenceEqual() для сравнения байтов. Если вы присваиваете объект другому, а затем сравниваете его, вы фактически сравниваете ссылку (адрес памяти) с самим собой.