¿Hay alguna manera mejor que examinarlos píxel por píxel?¿Cuál es la forma más rápida de verificar si dos Tbitmaps son iguales?
Respuesta
Puede guardar ambos mapas de bits a TMemoryStream y compara usando CompareMem:
function IsSameBitmap(Bitmap1, Bitmap2: TBitmap): Boolean;
var
Stream1, Stream2: TMemoryStream;
begin
Assert((Bitmap1 <> nil) and (Bitmap2 <> nil), 'Params can''t be nil');
Result:= False;
if (Bitmap1.Height <> Bitmap2.Height) or (Bitmap1.Width <> Bitmap2.Width) then
Exit;
Stream1:= TMemoryStream.Create;
try
Bitmap1.SaveToStream(Stream1);
Stream2:= TMemoryStream.Create;
try
Bitmap2.SaveToStream(Stream2);
if Stream1.Size = Stream2.Size Then
Result:= CompareMem(Stream1.Memory, Stream2.Memory, Stream1.Size);
finally
Stream2.Free;
end;
finally
Stream1.Free;
end;
end;
begin
if IsSameBitmap(MyImage1.Picture.Bitmap, MyImage2.Picture.Bitmap) then
begin
// your code for same bitmap
end;
end;
no lo hice referencia este código X línea de escaneo, si lo hace, por favor sepamos cuál es el más rápido.
Algunos comentarios: 1) El código no es a prueba de excepciones. 2) Devolvería False inmediatamente si el ancho o la altura de los mapas de bits difieren. O tal vez incluso si los formatos de píxeles difieren, pero la pregunta es demasiado vaga para contar. – mghie
Nice comentarios mghie. Cambiaré el código para probar la altura y el ancho. –
Tragar excepciones no era lo que quise decir, permitirme editar el código ... – mghie
Si necesita una respuesta precisa, no. Si necesita una aproximación, probablemente pueda verificar una selección de píxeles. Pero si quiere saber si los dos mapas de bits son exactamente idénticos, necesita comparar los datos de formato de píxel y píxel completos.
Uso de ScanLine, sin TMemoryStream.
function IsSameBitmapUsingScanLine(Bitmap1, Bitmap2: TBitmap): Boolean;
var
i : Integer;
ScanBytes : Integer;
begin
Result:= (Bitmap1<>nil) and (Bitmap2<>nil);
if not Result then exit;
Result:=(bitmap1.Width=bitmap2.Width) and (bitmap1.Height=bitmap2.Height) and (bitmap1.PixelFormat=bitmap2.PixelFormat) ;
if not Result then exit;
ScanBytes := Abs(Integer(Bitmap1.Scanline[1]) - Integer(Bitmap1.Scanline[0]));
for i:=0 to Bitmap1.Height-1 do
Begin
Result:=CompareMem(Bitmap1.ScanLine[i],Bitmap2.ScanLine[i],ScanBytes);
if not Result then exit;
End;
end;
Adiós.
+1 muy bien compuesto. Sería interesante comparar la velocidad de esta versus la solución de Cesar. Esto tiene más comparaciones, pero ahorra tiempo al no asignar memoria. El título de la pregunta especificó ** más rápido **, después de todo. – Argalatyr
@RRUZ: Estoy de acuerdo en que esta es una buena solución si el mismo mapa de bits significa el mismo diseño de memoria, +1. Sin embargo, consideraría que un control rápido para mapas de bits iguales en formatos posiblemente diferentes sea un problema más interesante. Si un mapa de bits pf24bit o pf32bit tiene menos de 256 colores, puede tener sentido guardarlo en pf8bit, pero seguirá mostrándose el mismo mapa de bits. – mghie
Normalmente solo uso pf8bit, y para esto estaría bien. Sin embargo, me pregunto si los bits de alineación están marcados si tienes pf12bit y un ancho impar. Lo mismo para bpp's por debajo de 8, pero esos están planeados afaik. –
- 1. ¿Cuál es la forma más rápida de verificar si dos números dados son coprime?
- 2. Cocoa: compruebe si dos NSArrays son iguales
- 3. ¿Cuál es la forma más segura de determinar si 2 URL son iguales?
- 4. La forma más rápida de verificar si existe un objeto
- 5. ¿Cuál es la forma más rápida de verificar si todos los valores en una matriz son numéricos?
- 6. ¿Cuál es la forma más fácil de averiguar si dos archivos son diferentes por programación?
- 7. ¿Cuál es la forma más rápida de comparar dos mapas de bits de igual tamaño para determinar si son idénticos?
- 8. Comprueba si dos vectores son iguales
- 9. ¿Cuál es la forma más rápida de comparar dos matrices para la igualdad?
- 10. Determine si dos árboles binarios son iguales
- 11. Todas las cosas son iguales ¿cuál es la forma más rápida de generar datos en disco en C++?
- 12. ¿Cuál es la mejor y más rápida forma de verificar si la imagen es válida en PHP?
- 13. ¿Son dos funciones iguales?
- 14. LINQ: compruebe si dos listas son iguales
- 15. ¿La forma más rápida de verificar si un tipo es blittable?
- 16. ¿Cuál es la manera más rápida de verificar si hay dígitos duplicados de un número?
- 17. ¿Cuál es la forma más rápida de comparar matrices de dos bytes?
- 18. ¿Cuál es la forma más rápida de grabar varios archivos?
- 19. ¿Cuál es la forma más rápida de verificar si la cadena tiene una letra mayúscula en C#?
- 20. ¿Cuál es la forma más rápida de comparar la configuración IIS de dos servidores?
- 21. C manera más rápida de verificar si existe un directorio
- 22. ¿Cuál es la manera más rápida de verificar si una clase tiene una función definida?
- 23. MySQL - La forma más rápida de verificar si los datos en la tabla InnoDB han cambiado
- 24. al codificar cuál es la forma más rápida de determinar si un tipo es IDisposable
- 25. ¿Cuál es la forma más rápida de probar si un objeto es IEnumerable?
- 26. cómo verificar si 2 archivos son iguales usando .NET?
- 27. ¿Hay alguna manera de verificar si dos elementos DOM son iguales?
- 28. ¿Cuál es la forma más rápida de verificar si una palabra de una cadena está en otra cadena?
- 29. ¿Cuál es la forma más rápida de comparar dos objetos en PHP?
- 30. ¿Cuál es la forma más confiable de verificar si una variable de JavaScript es nula?
Aclare: si tienen diferentes formatos de píxeles (por ejemplo, pf24bit y pf8bit) y, por lo tanto, diferentes tamaños en la memoria, pero contienen exactamente los mismos píxeles, ¿son iguales o no? – mghie