#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)
. При создании нового растрового изображения без ссылки по умолчанию используется значение DPI96
, а 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()
для сравнения байтов. Если вы присваиваете объект другому, а затем сравниваете его, вы фактически сравниваете ссылку (адрес памяти) с самим собой.