Страница: 1 | 2 |
Вопрос: Сравнение картинок
Добавлено: 14.03.07 23:58
Автор вопроса: Эндрю | Web-сайт:
Ответы
Всего ответов: 25
Номер ответа: 16
Автор ответа:
Stars
Вопросов: 41
Ответов: 239
Профиль | | #16
Добавлено: 17.03.07 14:17
Номер ответа: 4
Номер ответа: 5
Последовательно сам прочти!
Номер ответа: 17
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #17
Добавлено: 17.03.07 14:59
Сие писал EUGY:
GetDIBits на порядок быстрее
Для "Сравнения картинок":
TODO:
GetDIBits(pic1.hdc,
GetDIBits(pic2.hdc,
сравнить байтовые массивы bt1() == bt2()
Умные товарищи меня поправят. (надеюсь)
Мой ответ на
AgentFire написал:
Мой ответ:
З.Ы. И на это тоже:
bt1 = bt2
Что не так? Сравнение массивов и сравнение элементов массива таки разные действия.
Номер ответа: 18
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #18
Добавлено: 17.03.07 18:55
предложение "сравнить байтовые массивы bt1() == bt2()" не является строкой кода VB, и предполагало сравнение элементов массивов в цикле.
Номер ответа: 19
Автор ответа:
D o c a l
ICQ: 408802757
Вопросов: 76
Ответов: 985
Web-сайт:
Профиль | | #19
Добавлено: 17.03.07 20:03
Ну может я написал не правильно
Номер ответа: 20
Автор ответа:
Эндрю
ICQ: 303-304-826
Вопросов: 24
Ответов: 103
Web-сайт:
Профиль | | #20
Добавлено: 18.03.07 00:22
По 14 ответу практически всё понятно.
Но кой-чего не понятно: почему когда в проге написана строчка
Form1.Caption = Picture1.Picture
и в PictureBox загружена картинка, то при каждом запуске в заголовке различные цифры?
Номер ответа: 21
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #21
Добавлено: 18.03.07 02:03
наводящий вопрос:
при каждом запуске Form1
Form1.hwnd одинаковый?
dim adr as long
adr = Picture1.Picture
adr - адрес объекта StdPicture
Номер ответа: 22
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #22
Добавлено: 18.03.07 02:06
Sorry, не адрес, а сам объект.
Номер ответа: 23
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #23
Добавлено: 18.03.07 02:41
Option Explicit
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
'---
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As String * 1024
End Type
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Sub Command1_Click()
Debug.Print ComparePicture(Form1.hdc, Picture1.Picture, Picture2.Picture)
End Sub
Private Function ComparePicture(memhdc As Long, pic1 As StdPicture, pic2 As StdPicture) As Boolean
Dim bt1() As Byte
Dim bt2() As Byte
Dim bim1 As BITMAPINFO
Dim bim2 As BITMAPINFO
Dim u1 As Long
Dim u2 As Long
Dim x As Long
If pic1.Type <> 1 Or pic1.Type <> 1 Then
MsgBox "неверный формат, (не Bitmap), лень писать"
Exit Function
End If
bim1.bmiHeader.biSize = 40
bim2.bmiHeader.biSize = 40
'выяснить размеры
Call GetDIBits(hdc, pic1.Handle, 0, 0, ByVal 0, bim1, ByVal 0)
Call GetDIBits(hdc, pic2.Handle, 0, 0, ByVal 0, bim2, ByVal 0)
u1 = bim1.bmiHeader.biSizeImage - 1
u2 = bim2.bmiHeader.biSizeImage - 1
If u1 <> u2 Then
ComparePicture = False 'размеры не совпадают
Exit Function
End If
'
ReDim bt1(u1)
ReDim bt2(u2)
Call GetDIBits(hdc, pic1.Handle, 0, bim1.bmiHeader.biHeight, ByVal VarPtr(bt1(0)), bim1, ByVal 0)
Call GetDIBits(hdc, pic2.Handle, 0, bim2.bmiHeader.biHeight, ByVal VarPtr(bt2(0)), bim2, ByVal 0)
For x = 0 To u1
If bt1(x) <> bt1(x) Then
ComparePicture = False 'размеры не совпадают
Exit Function
End If
Next
ComparePicture = True
End Function
Номер ответа: 24
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #24
Добавлено: 18.03.07 02:44
кое-где ляпы из-за copy/past.
...
If pic1.Type <> 1 Or pic2.Type <> 1 Then
...
If bt1(x) <> bt2(x) Then
...
Номер ответа: 25
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #25
Добавлено: 18.03.07 03:43
и для прикола, можно без цикла:
If CStr(bt1()) = CStr(bt2()) Then
ComparePicture = True 'массивы идентичны
End If