線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2826
推到 Plurk!
推到 Facebook!

請問該如何辨別二張image是否一樣

答題得分者是:dllee
joec913137
一般會員


發表:2
回覆:1
積分:0
註冊:2006-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-27 21:26:38 IP:61.70.xxx.xxx 訂閱

[code delphi]
var
R1, G1, B1, gray1: Byte;
R2, G2, B2, gray2: Byte;
bmp1, bmp2: TBitmap;
jpg1, jpg2: Tjpegimage;
x, y, n: integer;
temptime: tdatetime;

begin

jpg1 := Tjpegimage.Create;
jpg2 := Tjpegimage.Create;
bmp1 := TBitmap.Create;
bmp2 := TBitmap.Create;
jpg1.LoadFromFile(image1.jpg);
jpg2.LoadFromFile(
image2.jpg);
bmp1.Assign(jpg1);
bmp2.Assign(jpg2);

temptime := now;
n := 0;
for x := 1 to bmp1.Width do
begin
for y := 1 to bmp1.Height do
begin
R1 := GetRValue(bmp1.Canvas.Pixels[x, y]);
G1 := GetGValue(bmp1.Canvas.Pixels[x, y]);
B1 := GetBValue(bmp1.Canvas.Pixels[x, y]);
gray1 := (R1 G1 B1) div 3;

R2 := GetRValue(bmp2.Canvas.Pixels[x, y]);
G2 := GetGValue(bmp2.Canvas.Pixels[x, y]);
B2 := GetBValue(bmp2.Canvas.Pixels[x, y]);
gray2 := (R2 G2 B2) div 3;

if gray2 - gray1 = 0 then
n := n
else
n := n 1;

end
end;
if n <> 0 then
edit1.Text := '不一樣'
else
edit1.Text := '一樣';
edit2.text := formatdatetime('hh:nn:ss:zzz', now - temptime);

[/code]
image1和image2都是1280x1024的jpg檔
我的想法是對二張圖取pixel值做相減
可是辨別的時間滿久的

有改用while迴圈去跑 當二張圖pixel值做相減不為零時就跳出迴圈
但如果二張圖一樣的話 還是要執行滿久的

小弟是初學者="=a 請問有改善的方法或是有別的做法可行嗎??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-27 22:13:30 IP:59.105.xxx.xxx 訂閱
使用 Scanline 的方式,可在本站找到許多相關文件。
再來可直接使用內建函式 CompareMem
http://www.freepascal.org/docs-html/rtl/sysutils/comparemem.html

結果, 用 Scanline 及 CompareMem 在本站就可以找到您要的解答了:
怎样快速比对两幅图像是否完全一致



Seednet ShareMe 免費網路硬碟, 申請送2G, 用 MSN 幫她打廣告加 10G, 推薦1人加 1G, 活動只到 9 月底, 請把握時機
------
http://www.ViewMove.com
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-27 22:24:21 IP:211.76.xxx.xxx 訂閱
直接比較檔案


[code delphi]

procedure TfrmTestMain.Button1Click(Sender: TObject);
var
Bool: Boolean;
I, J: Integer;
F1, F2: TFileStream;
FN1, FN2: string;
begin
FN1 := 'image1.jpg';
FN2 := 'image2.jpg';
Bool := FileExists(FN1) and FileExists(FN2);
if Bool then//Bool=TRUE
begin
F1 := TFileStream.Create(FN1, fmOpenRead);
try
F2 := TFileStream.Create(FN2, fmOpenRead);
try
Bool := F1.Size = F2.Size;
if Bool then//Bool=TRUE
begin
F1.Position := 0;
F2.Position := 0;
while F1.Position < F1.Size do
begin
Bool := (F1.Read(I,SizeOf(I)) = F2.Read(J, SizeOf(J))) and (I=J);
if not Bool then Break;
end;
end;
finally
FreeAndNil(F2);
end;
finally
FreeAndNil(F1);
end;
end;

if Bool then Label1.Caption := '一樣'
else Label1.Caption := '不一樣';

end;


請在此區域輸入程式碼
[/code]


joec913137
一般會員


發表:2
回覆:1
積分:0
註冊:2006-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-29 10:06:47 IP:203.68.xxx.xxx 訂閱
用scanline去寫在速度上真的快很多
因為小弟目前在寫server to client 小程式
以server截取畫面 傳送到client
二張image相同的話 則不須傳送 直到不同才傳送資料

謝謝二位大大的指教
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-29 15:17:25 IP:220.134.xxx.xxx 訂閱
除非您的取像裝置很好,要不就是您的環境很好,
否則,不太可能取到兩個像會一模一樣的。
也許眼睛看來差不多,但每個像素只要有一點差,
用 CompareMem 就視為不同了。
如果這樣,還不如不用浪費時間在比對上,直接傳就好。
如果真的要比對,要自行用 Scanline 作,數值差不多的,視為相同,
才能真的減少傳輸量。

Seednet ShareMe 免費網路硬碟, 申請送2G, 用 MSN 幫她打廣告加 10G, 推薦1人加 1G, 活動只到 9 月底, 請把握時機
------
http://www.ViewMove.com
系統時間:2024-03-28 17:51:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!