픽셀 단위로 검사하는 것이 더 좋은 방법이 있습니까?두 개의 Tbitmaps가 동일한 지 확인하는 가장 빠른 방법은 무엇입니까?
답변
당신은 TMemoryStream이에게 모두 비트 맵을 저장하고 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;
이 코드의 X의 주사선 벤치 마크하지 않았다, 당신이 경우에, 우리가 가장 빠른 어느 알려 주시기 바랍니다.
정확한 답이 필요하면 아니오. 근사값이 필요한 경우 픽셀 선택을 확인할 수 있습니다. 그러나 두 비트 맵이 정확히 일치하는지 알아 보려면 전체 픽셀 및 픽셀 형식 데이터를 비교해야합니다.
TMemoryStream없이 ScanLine을 사용하십시오.
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;
안녕히 계십시오.
+1 매우 멋지게 작곡. 이 속도와 Cesar의 해를 비교하는 것은 흥미로울 것입니다. 이것은 더 많은 비교를하지만, 메모리를 할당하지 않음으로써 시간을 절약합니다. 질문 제목은 ** 가장 빠른 **를 지정했습니다. – Argalatyr
@RRUZ : 동일한 비트 맵이 동일한 메모리 레이아웃 +1을 의미하는 경우 좋은 해결책이라는 데 동의합니다. 하지만 좀 더 흥미로운 문제가 될 수있는 서로 다른 형식의 동일한 비트 맵에 대한 빠른 검사를 고려해 볼 수 있습니다. pf24bit 또는 pf32bit 비트 맵의 색상이 256보다 작 으면 pf8bit로 저장하는 것이 좋지만 동일한 비트 맵이 계속 표시됩니다. – mghie
필자는 보통 pf8bit 만 사용하며이 경우에는 괜찮습니다. 만약 pf12bit와 홀수 너비가 있다면 정렬 비트가 검사되는지 궁금합니다. bpp가 8 세 미만인 경우와 동일하지만 afaik가 계획되어 있습니다. –
- 1. 파일이 동일한 지 확인하는 가장 빠른 방법은 무엇입니까?
- 2. 두 조건이 참인지 확인하는 가장 빠른 방법은 무엇입니까?
- 3. 두 파일 이름이 동일한 실제 파일을 가리키는 지 확인하는 방법
- 4. 두 개의 주어진 숫자가 서로 상충하는지 확인하는 가장 빠른 방법은 무엇입니까?
- 5. 이미지가 PHP에서 유효한지 확인하는 가장 빠르고 가장 빠른 방법은 무엇입니까?
- 6. 두 ICollection <T> 컬렉션에 동일한 개체가 들어 있는지 여부를 확인하는 가장 빠른 방법
- 7. 두 URL을 비교하는 가장 빠르고 가장 빠른 방법은 무엇입니까?
- 8. 캐시가 가득 찼는 지 확인하는 방법은 무엇입니까?
- 9. 두 개의 html 문자열이 파이썬과 동일한 지 어떻게 확인합니까?
- 10. 캔버스 위젯에 두 개의 오브젝트가 겹쳐져 있는지 확인하는 방법은 무엇입니까?
- 11. 두 문자열이 다른 경우 가장 효율적으로 확인하는 방법은 무엇입니까?
- 12. 기계가 튜링 기계와 동일한 지 확인하는 방법
- 13. Groovy에서 두 날짜가 같은 날인지 확인하는 가장 좋은 방법은 무엇입니까?
- 14. Powershell에서 두 파일이 다른지 가장 빠른 방법은 무엇입니까?
- 15. 두 개의 숫자를 나누어서 지수를 찾는 가장 빠른 방법
- 16. 우편 번호를 iPhone에 존재하는 것으로 확인하는 가장 빠른 방법은 무엇입니까?
- 17. python에서 문자열이 전자 메일인지 정수인지를 확인하는 가장 빠른 방법은 무엇입니까?
- 18. ASP.NET 프로젝트가 디버그 기호로 컴파일되었는지 확인하는 가장 빠른 방법은 무엇입니까?
- 19. 폴더 크기가 특정 크기보다 큰지 확인하는 가장 빠른 방법은 무엇입니까?
- 20. 해당 항목이 데이터베이스에 있는지 확인하는 가장 빠른 방법은 무엇입니까?
- 21. mongodb doc의 존재를 확인하는 가장 빠른 방법은 무엇입니까?
- 22. PHP에 URL이 있는지를 확인하는 가장 빠른 방법은 무엇입니까?
- 23. 필드에 단어가 n 개 이하임을 확인하는 가장 빠른 방법은 무엇입니까?
- 24. SQL 서버 가용성을 확인하는 가장 빠른 방법은 무엇입니까?
- 25. 이미지에 반투명 픽셀이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까?
- 26. 값 존재 여부를 확인하는 가장 빠른 방법
- 27. 마지막주기에서 10 개의 정수가 변경되었는지 확인하는 가장 빠른 방법
- 28. 두 이미지 파일이 Perl에서 동일한 지 어떻게 알 수 있습니까?
- 29. 가장 빠른 저장 방법은 무엇입니까?
- 30. 의도적으로 해시가 동일한 두 개의 파일을 만드시겠습니까?
서로 다른 픽셀 형식 (예 : pf24bit 및 pf8bit)을 사용하고 있기 때문에 메모리 크기는 다르지만 정확히 동일한 픽셀을 포함하는 경우 동일하거나 짝이 맞지 않습니까? – mghie