有沒有更好的方法,而不是逐個像素地檢查它們?檢查兩個Tbitmap是否相同的最快方法是什麼?
回答
可以節省位圖到內存流和使用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掃描線,如果你這樣做,請讓我們知道哪一個是最快的。
如果你需要一個準確的答案,沒有。如果你需要一個近似值,你可能會檢查一個像素的選擇。但是如果你想知道兩個位圖是否完全相同,你需要比較整個像素和像素格式的數據。
使用ScanLine,無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;
再見。
+1非常好地組成。比較這個與Cesar的解決方案的速度會很有趣。這有更多的比較,但通過不分配內存節省時間。問題標題確實指定了**最快的**,畢竟。 – Argalatyr 2009-08-30 01:45:00
@RRUZ:我同意這是一個很好的解決方案,如果相同的位圖意味着相同的內存佈局+1。儘管如此,我認爲儘快檢查可能不同格式的相同位圖是一個更有趣的問題。如果pf24bit或pf32bit位圖的顏色少於256色,則將其保存爲pf8bit是合理的,但仍會顯示相同的位圖。 – mghie 2009-08-30 06:46:26
我通常只使用pf8bit,爲此可以。我想知道如果對齊位被檢查,如果你有pf12bit和一個奇數的寬度。 bpp的8以下同樣,但是這些都是計劃的afaik。 – 2009-08-30 09:28:58
- 1. 檢查兩幅圖像是否相同的最簡單方法是什麼?
- 2. 檢查兩個條件是否爲真的最快方法是什麼?
- 3. 檢查兩個給定數字是否互反的最快方法是什麼?
- 4. 最快的方法來檢查兩個陣列是否有相同的行
- 5. 什麼是檢查文件是否改變的最快方法?
- 6. 檢查兩個CRgn是否相交的最簡單方法是什麼?
- 7. 檢查一個類是否定義了函數的最快方法是什麼?
- 8. 檢查兩個查詢是否相同
- 9. 檢查兩個數字是否相等的最佳方法
- 10. 檢查兩個張量形狀是否相同,包括無的最佳方法是什麼?
- 11. 檢查兩個日期在Groovy中是否相同日曆日的最佳方法是什麼?
- 12. PHP:檢查3個變量是否相同的最佳方法?
- 13. Swift:檢查兩個NSDates是否相同
- 14. 檢查兩個json是否相同
- 15. 檢查兩個ID是否相同
- 16. 檢查兩個jar類是否相同
- 17. 檢查兩個Dask是否相同
- 18. 檢查兩個列表的內容是否相同的最佳方法?
- 19. 什麼是檢查svn工作副本是否有變化的最快方法?
- 20. 算法:什麼是檢查集合包含的最快方法?
- 21. 什麼是最快的方法來檢查給定的數組是否有數組或兩個值?
- 22. 檢查視窗是否可見的最佳方法是什麼?
- 23. 檢查FileInputStream是否關閉的最佳方法是什麼?
- 24. 什麼是檢查PDO是否存在的最佳方法
- 25. 什麼是MySQL的最快的方法來檢查外國REFFERENCE
- 26. PHP:檢查$ _SERVER ['HTTP_REFERER']是否相等的最佳方法是什麼?
- 27. 什麼是檢查mongodb文檔存在的最快方法?
- 28. 檢查號碼重複數字的最快方法是什麼?
- 29. Tcl:什麼是檢查空白字符串的最快方法
- 30. 在Python中檢查重複項的最快方法是什麼?
請說明:如果它們具有不同的像素格式(例如pf24bit和pf8bit),因此內存大小不同,但包含完全相同的像素,它們是否相同? – mghie 2009-08-29 20:58:34