「JPEG」と「メタデータ」という単語を検索すると、メタデータを操作するための多くの回答が得られます...これは私が望む反対です... ;o)
私が望むように正確に機能する関数を作成しました...(画像が類似していて、メタデータのみが変更されているかどうかにかかわらず、関数は を返しますTrue
;少なくとも1つのピクセルが変更された場合、それは を返しますFalse
)しかし、私は改善したいと思いますパフォーマンス...
ボトルネックは、bmp.Assign(jpg);
function CompareImages(fnFrom, fnTo: TFileName): Boolean;
var
j1, j2: TJpegImage;
b1, b2: TBitmap;
s1, s2: TMemoryStream;
begin
Result := False;
sw1.Start;
j1 := TJpegImage.Create;
j2 := TJpegImage.Create;
sw1.Stop;
sw2.Start;
s1 := TMemoryStream.Create;
s2 := TMemoryStream.Create;
sw2.Stop;
//sw3.Start;
b1 := TBitmap.Create;
b2 := TBitmap.Create;
//sw3.Stop;
try
sw1.Start;
j1.LoadFromFile(fnFrom);
j2.LoadFromFile(fnTo);
sw1.Stop;
// the very long part...
sw3.Start;
b1.Assign(j1);
b2.Assign(j2);
sw3.Stop;
sw4.Start;
b1.SaveToStream(s1);
b2.SaveToStream(s2);
sw4.Stop;
sw2.Start;
s1.Position := 0;
s2.Position := 0;
sw2.Stop;
sw5.Start;
Result := IsIdenticalStreams(s1, s2);
sw5.Stop;
finally
// sw3.Start;
b1.Free;
b2.Free;
// sw3.Stop;
sw2.Start;
s1.Free;
s2.Free;
sw2.Stop;
sw1.Start;
j1.Free;
j2.Free;
sw1.Stop;
end;
end;
sw1、...、sw5 はTStopWatch です。私は費やした時間を特定するために使用しました。
IsIdenticalStreams はhereから来ています。
を直接比較するTJpegImage
と、ストリームが異なります...
それをコーディングするより良い方法はありますか?
よろしく、
W.
アップデート:
コメントから抽出したいくつかのソリューションをテストすると、次のコードで同じパフォーマンスが得られます。
type
TMyJpeg = class(TJPEGImage)
public
function Equals(Graphic: TGraphic): Boolean; override;
end;
...
function CompareImages(fnFrom, fnTo: TFileName): Boolean;
var
j1, j2: TMyJpeg;
begin
sw1.Start;
Result := False;
j1 := TMyJpeg.Create;
j2 := TMyJpeg.Create;
try
j1.LoadFromFile(fnFrom);
j2.LoadFromFile(fnTo);
Result := j1.Bitmap.Equals(j2.Bitmap);
finally
j1.Free;
j2.Free;
end;
sw1.Stop;
end;
ビットマップ変換せずに、ファイルからピクセル データ バイトに直接アクセスする (メタデータ バイトをスキップする) 方法はありますか?