Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: gulabyte en 25 Noviembre 2009, 16:54 pm



Título: API Comparar Imagenes
Publicado por: gulabyte en 25 Noviembre 2009, 16:54 pm

Wenas! Me podría decir álguien el nombre de la API para comparar imagenes?? es para la captura, quiero que si dos imagenes capturadas son iguales no guarde la imagen que es igual....

he buscado por el foro pero no he encontrado justo eso, lo que yo quiero es que compare el 100% de la imagen, si cambiara por ejemplo la hora de la barra de herramientas pues que guardára la imagen o no sé eso ya luego..

gracias de antemano!

salu2


Título: Re: API Comparar Imagenes
Publicado por: Jaixon Jax en 25 Noviembre 2009, 17:05 pm
Si esa Api existiera yo estuviera en las Islas Caiman  :-* .


Título: Re: API Comparar Imagenes
Publicado por: BrokenWindow en 25 Noviembre 2009, 17:11 pm
Podrias hace la comprovacion con dos for anidados y llamando a GetPixel().

Saludos


Título: Re: API Comparar Imagenes
Publicado por: Jaixon Jax en 25 Noviembre 2009, 17:18 pm
Podrias hace la comprovacion con dos for anidados y llamando a GetPixel().

Saludos

  Si son dos capturas de pantalla funcionara el problema viene cuando son dos fotos  :¬¬ una recomendacion seria que no utilices un coeficiente de 100 % de igualdad ya que algunos pixeles podrian no ser iguales para un ScreenShot un 90% esta Bien ...

  Saludos ...


Título: Re: API Comparar Imagenes
Publicado por: gulabyte en 29 Noviembre 2009, 14:09 pm

yo uso la clase cJPEG.cls para crear el archivo de captura... si no cambia nada en la pantalla debería ser igual pixel por pixel no¿ conlcusión que hay que hacerlo con GetPixel y comparar la razón de igualdad..

grace mille

salu3


Título: Re: API Comparar Imagenes
Publicado por: KJD en 29 Noviembre 2009, 15:06 pm
y que tal un md5? osea si solamente queres saber si 2 imagenes son iguales no necesariamente tenes que "verla" me epxlico. :)


Título: Re: API Comparar Imagenes
Publicado por: agus0 en 30 Noviembre 2009, 01:38 am
Aquí tienes un codigo que compara dos imagenes y dice si son o no iguales, lo probe y anda perfecto, lo encontre por hay tirado en la web, no es mio

Código:
Private Declare Function GetBitmapBits Lib "gdi32" _
    (ByVal hBitmap As Long, ByVal dwCount As Long, _
    lpBits As Any) As Long


Private Declare Function GetObject Lib "gdi32" Alias _
    "GetObjectA" (ByVal hObject As Long, ByVal nCount _
    As Long, lpObject As Any) As Long

Private Type BITMAP
      bmType As Long
      bmWidth As Long
      bmHeight As Long
      bmWidthBytes As Long
      bmPlanes As Integer
      bmBitsPixel As Integer
      bmBits As Long
End Type


Private Function GetBitmapData(pic As PictureBox) As String

      Dim tBitmap As BITMAP
      Dim bPicBytes() As Byte
      Dim lByteLen As Long
      Dim lBytesPerLine As Long

      GetObject Picture1.Image.Handle, Len(tBitmap), tBitmap

      lBytesPerLine = (tBitmap.bmWidth * 4)
      lByteLen = lBytesPerLine * tBitmap.bmHeight
      ReDim bPicBytes(1 To lByteLen)
      GetBitmapBits pic.Picture.Handle, UBound(bPicBytes), bPicBytes(1)
     
      GetBitmapData = bPicBytes
End Function

Private Sub Form_Load()
MsgBox GetBitmapData(Picture1) = GetBitmapData(Picture2)
End Sub


Título: Re: API Comparar Imagenes
Publicado por: cobein en 30 Noviembre 2009, 08:05 am
A ver, considerando que tenes una pantalla comun con una resolucion normal unos 1280 x 667 y estas usando 4 bytes por pixel como en el ejemplo y a todo esto le sumamos que lo estas guardando en memoria como un string que es unicode osea que es el doble de tamano y como para finalizar, esto pasa 2 veces por lo menos como para realizar la comparacion.. nos quedaria asi.

1280 * 667 * 4 * 2 * 2 = 13660160 algo asi como 13.03 megabytes ....

mmm esto en mi 286 no anda seguro. :/ necesito un upgrade urgente.


Título: Re: API Comparar Imagenes
Publicado por: gulabyte en 30 Noviembre 2009, 14:40 pm

gracias por responder! lo del md5 es perfecto KJD abr si me las arreglo para hacerlo mediante visual basic...
el código funciona bien y es rápido... las imagenes que crea el módulo son de unos 100kb oseake se podría hacer...


Título: Re: API Comparar Imagenes
Publicado por: gulabyte en 30 Noviembre 2009, 15:59 pm
encontré un buen código en esta página http://www.eggheadcafe.com/community/aspnet/8/11572/fastest-way-of-finding-md.aspx para crear el string MD5 pero para eso necesita otro string.. como hago para cargar los archivos de las fotos a strings?? es decir como cargar esas fotos en strings¿¿

gracias por responder


Título: Re: API Comparar Imagenes
Publicado por: gulabyte en 30 Noviembre 2009, 20:06 pm
Cómo se podría cargar o asignarle un archivo (una foto .jpeg) a un string¿¿


Título: Re: API Comparar Imagenes
Publicado por: Jaixon Jax en 30 Noviembre 2009, 22:10 pm
 ;D  ese estring del que hablas no sera un bufer :¬¬ en fin eso son los string buffers en lo cual puedes meter de todo no solo palabras y cobein tiene razon ese algoritmo no es nada eficiente los cuadros que quieres comparar tienen que estar exactamente en el mismo sitio en cada captura y con un solo bits que sean diferentes te dira que son diferentes las imagenes .... :)


Título: Re: API Comparar Imagenes
Publicado por: BlackZeroX en 1 Diciembre 2009, 00:59 am
Cómo se podría cargar o asignarle un archivo (una foto .jpeg) a un string¿¿

Estas de broma verdad, porque ya te lo postearon aquí


Título: Re: API Comparar Imagenes
Publicado por: Karcrack en 2 Diciembre 2009, 20:43 pm
No es necesario que sea un MD5, cualquier hash te valdria... claro, si lo haces tu hay que ir con cuidado, ya que puede darse el caso de que dos conjuntos de datos den el mismo hash... mira este algoritmo que acabo de hacer por ejemplo:

Código
  1. Private Sub Form_Load()
  2.    Dim bvTMP()     As Byte
  3.  
  4.    Call LoadFile("C:\WINDOWS\SYSTEM32\CALC.EXE", bvTMP)
  5.    Debug.Print Hex$(GetHash(bvTMP)),
  6.    Call LoadFile("C:\WINDOWS\SYSTEM32\NOTEPAD.EXE", bvTMP)
  7.    Debug.Print Hex$(GetHash(bvTMP))
  8. End Sub
  9.  
  10. Public Function GetHash(ByRef bvArray() As Byte) As Double
  11.    Dim i           As Long
  12.  
  13.    For i = LBound(bvArray) To UBound(bvArray)
  14.        GetHash = GetHash + (bvArray(i) Xor (((GetHash And &HFFFF0000) \ &H10000) And &HFF))
  15.    Next i
  16. End Function
  17.  
  18. Public Sub LoadFile(ByVal sPath As String, ByRef bvRET() As Byte)
  19.    Open sPath For Binary As #1
  20.        ReDim bvRET(0 To LOF(1) - 1)
  21.        Get #1, , bvRET
  22.    Close #1
  23. End Sub

Es bastante rapido ::) Me parece una buena alternativa al MD5 :P


Un codigo funcional para comparar:
Código:
Option Explicit

'GDI32
Private Declare Function GetBitmapBits Lib "GDI32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function GetObject Lib "GDI32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

Private Type BITMAP
    bmType          As Long
    bmWidth         As Long
    bmHeight        As Long
    bmWidthBytes    As Long
    bmPlanes        As Integer
    bmBitsPixel     As Integer
    bmBits          As Long
End Type

Private Sub GetBitmapData(ByVal pPIC As PictureBox, ByRef bvRet() As Byte)
    Dim tBitmap       As BITMAP
   
    Call GetObject(pPIC.Image.Handle, Len(tBitmap), tBitmap)

    ReDim bvRet(0 To (tBitmap.bmWidth * 4) * tBitmap.bmHeight) As Byte
   
    Call GetBitmapBits(pPIC.Picture.Handle, UBound(bvRet), bvRet(0))
End Sub

Public Function GetHash(ByRef bvArray() As Byte) As Double
    Dim i           As Long
 
    For i = LBound(bvArray) To UBound(bvArray)
        GetHash = GetHash + (bvArray(i) Xor (((GetHash And &HFFFF0000) \ &H10000) And &HFF))
    Next i
End Function

Private Sub Form_Load()
    Dim p1()        As Byte
    Dim p2()        As Byte
   
    Call GetBitmapData(Picture1, p1)
    Call GetBitmapData(Picture2, p2)
   
    If GetHash(p1) = GetHash(p2) Then MsgBox "IGUALES!"
End Sub

Como dice Cobien es un gasto de memoria grande...


Título: Re: API Comparar Imagenes
Publicado por: gulabyte en 3 Diciembre 2009, 01:19 am
Gracias por responder! Entonces mejor ir mandando y borrando capturas que hacer gasto de memoria en comparar las imagenes¿?  ;D ;D