請問各位: 如何判斷2幅BMP圖片內容是否相同, 或則 相同的程度 ( 积分: 100 )

  • 主题发起人 主题发起人 hgptm
  • 开始时间 开始时间
首先判断文件的宽高等文件属性,一样则循环判断每个相同位置点像素颜色是否一致
 
多謝!
我做到如下步驟:
var
dc:HDC;
hdd:HDRAWDIB;
Stream: TStream;
hdr: BITMAPFILEHEADER;
m_pbmih: TBITMAPINFOHEADER;
BITMAP_TYPE: WORD;

S: string;
len: Integer;
DataSize: Integer;

sFileName,str,sonstr: string;
FSize,w,h,i,n,m: integer;
buff: array of char;

Lst : Tstrings;
begin
Lst := Tstringlist.Create;
try
Form1.Caption :='';

OpenDialog1.FileName := sFileName;

Image1.Picture.Bitmap.FreeImage;
//Image1.Picture.LoadFromFile(sFileName);

if OpenDialog1.Execute then begin
sFileName := OpenDialog1.FileName;
end else begin
Exit;
end;
Image1.Picture.Bitmap.LoadFromFile(sFileName);


//BMP文件頭兩個字段必需是BM
BITMAP_TYPE := (WORD(Ord('M') shl 8)) or Ord('B');

Stream := TFileStream.Create(sFileName,{需要顯示的文件名}
fmOpenRead );
try
//1.讀文件頭
len := Stream.Read(hdr, SizeOf(hdr));
if ((len<>sizeof(hdr)) or (hdr.bfType<>BITMAP_TYPE)) then Exit;//無效BMP文件

//2.讀位圖信息頭
Stream.Read(m_pbmih, SizeOf(m_pbmih));
w := m_pbmih.biWidth;
h := m_pbmih.biHeight;

//計算位圖數據大小
// = 文件總大小 - 文件頭大小 - 位圖信息圖大小 - 顏色表大小
//注意,顏色表大小由biBitCount确定:
//當biBitCount=1,4,8時,分別有2,16,256個表項;
//當biBitCount=24時,沒有顏色表項。

FSize := Stream.Size;

DataSize := Stream.Size - SizeOf(m_pbmih) - SizeOf(hdr);
if (m_pbmih.biClrUsed = 0)and(m_pbmih.biBitCount<=8) then
DataSize := DataSize - SizeOf(RGBQUAD) * (1 shl m_pbmih.biBitCount);

//3 讀位圖數據
SetString(S, nil, DataSize);
Stream.Read(Pointer(S)^, DataSize);


當我分析&quot;位圖數據&quot;時,
1. 如何判斷是一行的結束
2.如何判斷是文件尾
資料上講的以0000為行結束
以0001為文件尾
不知是如何理解?
 
我想判断所有的像素点就好了!
 
还可以转换成黑白/灰度再比较
 
后退
顶部