請問該如何辨別二張image是否一樣 |
答題得分者是:dllee
|
joec913137
一般會員 發表:2 回覆:1 積分:0 註冊:2006-07-12 發送簡訊給我 |
[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 發送簡訊給我 |
使用 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 發送簡訊給我 |
直接比較檔案
[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 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
除非您的取像裝置很好,要不就是您的環境很好,
否則,不太可能取到兩個像會一模一樣的。 也許眼睛看來差不多,但每個像素只要有一點差, 用 CompareMem 就視為不同了。 如果這樣,還不如不用浪費時間在比對上,直接傳就好。 如果真的要比對,要自行用 Scanline 作,數值差不多的,視為相同, 才能真的減少傳輸量。 ■ Seednet ShareMe 免費網路硬碟, 申請送2G, 用 MSN 幫她打廣告加 10G, 推薦1人加 1G, 活動只到 9 月底, 請把握時機 ■
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |