Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Confronto BMP

Ciao belli!!!
Scusate, qualcuno conosce un sistema per confrontare due BMP (o delle
porzioni di BMP)???
Nel senso che mi dica se sono identiche oppure no?
Grazie infinite! :):)
Ciauz
:):):[]
Pietro Bello
  PEPPUS
http://geocities.com/peppusoft/
http://geocities.com/gnammyland/
http://geocities.com/acquariuz/
 
http://geocities.com/sistemieinformatica/
  --> building


http://geocities.com/sistemieinformatica/
  --> building
---
Vorrei vedere le piramidi di Cheope,
ma sono miope, ma sono miope.
---

 wrote in message
news:397ed40b...@100.0.57.0...


Alessandro
E' vero, ottima idea. Grazie. 
Grasie anche a cheope: non ho problemi di tempo=> tenterò anche la via
indicata da te se ho problemi...
Ciauuuuuzzz :)


Io ci ho provato per controllare se avevo loghi operatore uguali, ma con ca.
1000 file di 1-3 Kb ci metto 20 minuti (Ho provato con 4000 file e dopo 6
ore ne aveva controllati 250!)

ore ne aveva controllati 250!)
Ah, ok. Allora meglio lasciar stare. Grazie :)	



http://geocities.com/sistemieinformatica/
  --> building


Ho fatto la mia prova.
Fai un nuovo progetto, inserisci un modulo e togli il form; incolla
nel modulo quanto segue:
Option Explicit
Const min = 1
Dim max As Integer
Dim first() As Integer
Dim second() As Integer
Private Declare Function GetCurrentTime Lib "kernel32" Alias
"GetTickCount" () As Long
Private Sub Main()
 
    Dim x As Integer, y As Integer
    Dim diverso As Boolean
    Dim ElapsedTime As Long
 
    On Error GoTo imposta
    max = CInt(InputBox("Inserisci il valore massimo:", "Confronto",
"300"))
 
continua:
    ReDim first(min To max, min To max)
    ReDim second(min To max, min To max)
 
    For y = min To max
        For x = min To max
            first(x, y) = x + y
            second(x, y) = x + y
        Next x
    Next y
 
    second(max, max) = 0
 
    x = 0: y = 0
 
    diverso = False
 
    ElapsedTime = GetCurrentTime
 
    For y = min To max
        For x = min To max
            If first(x, y) <> second(x, y) Then
                diverso = True
                GoTo fine
            End If
        Next x
    Next y
    GoTo fine
imposta:
    max = 300
    GoTo continua
fine:
    If diverso Then
        ElapsedTime = GetCurrentTime - ElapsedTime
        Call MsgBox("Le due matrici sono diverse nella posizione: (" &
x & "," & y & ")." & vbCrLf & _
        "Il tempo necessario per l'operazione di confronto č stato di
" & ElapsedTime & " ms.", vbOKOnly + vbInformation, "Confronto")
    Else
        ElapsedTime = GetCurrentTime - ElapsedTime
        Call MsgBox("Non sono state trovate diversitą nelle due
matrici." & vbCrLf & _
        "Il tempo necessario per l'operazione di confronto č stato di
" & ElapsedTime & " ms.", vbOKOnly + vbInformation, "Confronto")
    End If
 
End Sub
Crea l'exeguibile ed eseguilo.
Io ho riscontrato i seguenti valori:
300x300:	10-16ms
600x600:	53-55ms
1000x1000:	154-155ms
2000x2000:	589-595ms
Nota: I tempi sono approssimativi, ma credo abbastanza giusti; il
calcolo č su matrici di interi e non sulle immagini, comunque ti
converrebbe prima leggere punto-punto ogni immagine e mettere il
valore nella matrice per velocizzare il confronto; il codice non č
"bello" a causa dei goto ma mi sembra ottimizzato. Ho forzato una
diversitą nell'ultimo elemento della seconda matrice per ricavare il
tempo limite.
Spero di esserti stato in qualche modo utile.


(...)
Sono d'accordo con *Alessandro* per l'uso dell'api BitBlt:
su una form con due picture con autosize=true
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long)
As Long
Const SRCINVERT = &H660046
Private Sub Picture1_Click()
    BitBlt Picture1.hDC, 0, 0, Picture1.Width, Picture1.Height,
Picture2.hDC, 0, 0, SRCINVERT
    Picture1.Refresh ' solo se Picture1.AutoreDraw=True
End Sub
(Cliccando sulla Picture1 si dovrebbe ottenere un rettangolo nero se le bmp
sono uguali)
Leggendo il tread "[?] immagine -> buffer e viceversa" si deduce che esiste
una funzione API, GetDIBits(), che permetterebbe di ottenere, partendo
dall'Hdc della picture, un array contenente i pixel dell'immagine (maggiori
chiarimenti sull'uso della funzione bisognerebbe chiederli a Roal Zanazzi).
La dichiarazione di GetDIBits č:
Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (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
Ma non so come si usa :-(
Quindi basterebbe, con un for-next (esiste una funzione intrinseca per
sommare un
array?), sommare i valori di questo array e vedere se č maggiore di 0 (bmp
differenti) o uguale a 0 (bmp uguali).
    Ciao, Silvio.

> Ah, ok. Allora meglio lasciar stare. Grazie :)
Bč, questo aprendo i file e leggendo, con le API non ci ho provato(Anzi
forse ci provo!).

L'ho fatto con GetPixel, mi sembra che funzioni ed è anche abbastanza
veloce:
51,3 secondi( con GetTickCount) per 907 file! :o)
Se vuoi ti mando il codice, basta chiedere!