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
Si esa Api existiera yo estuviera en las Islas Caiman :-* .
Podrias hace la comprovacion con dos for anidados y llamando a GetPixel().
Saludos
Cita de: BrokenWindow en 25 Noviembre 2009, 17:11 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 ...
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
y que tal un md5? osea si solamente queres saber si 2 imagenes son iguales no necesariamente tenes que "verla" me epxlico. :)
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
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
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.
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...
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
Cómo se podría cargar o asignarle un archivo (una foto .jpeg) a un string¿¿
;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 .... :)
Cita de: gulabyte en 30 Noviembre 2009, 20:06 PM
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í
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:
Private Sub Form_Load()
Dim bvTMP() As Byte
Call LoadFile("C:\WINDOWS\SYSTEM32\CALC.EXE", bvTMP)
Debug.Print Hex$(GetHash(bvTMP)),
Call LoadFile("C:\WINDOWS\SYSTEM32\NOTEPAD.EXE", bvTMP)
Debug.Print Hex$(GetHash(bvTMP))
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
Public Sub LoadFile(ByVal sPath As String, ByRef bvRET() As Byte)
Open sPath For Binary As #1
ReDim bvRET(0 To LOF(1) - 1)
Get #1, , bvRET
Close #1
End Sub
Es bastante rapido ::) Me parece una buena alternativa al MD5 :P
Un codigo funcional para comparar:
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...
Gracias por responder! Entonces mejor ir mandando y borrando capturas que hacer gasto de memoria en comparar las imagenes¿? ;D ;D