Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Сравнение картинок Добавлено: 14.03.07 23:58  

Автор вопроса:  Эндрю | Web-сайт: www.пока_нет.ru | ICQ: 303-304-826 

Ответить

  Ответы Всего ответов: 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:
P.S.
GetDIBits на порядок быстрее
Для "Сравнения картинок":
 TODO:
 GetDIBits(pic1.hdc,
 GetDIBits(pic2.hdc,
 сравнить байтовые массивы bt1() == bt2()

Умные товарищи меня поправят. (надеюсь)


Мой ответ на
сравнить байтовые массивы 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-сайт: www.doc-source.pp.net.ua/
 Профиль | | #19
Добавлено: 17.03.07 20:03
Ну может я написал не правильно

Ответить

Номер ответа: 20
Автор ответа:
 Эндрю



ICQ: 303-304-826 

Вопросов: 24
Ответов: 103
 Web-сайт: www.пока_нет.ru
 Профиль | | #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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам