紧急求助:如何读出16位BMP图象的图象数据(不要控件),请大师给出原代码?(200分)

  • 主题发起人 主题发起人 sundart
  • 开始时间 开始时间
var bmp :TBitmap ;

bmp := TBitmap.Create;

bmp.LoadFromFile( ... );//可能是TImage得方法,差不多了,我忘了

bmp.ScanLine[ bmp.Height -1 ] 就是图象数据得头指针
 
$(DELPHI)/Source/Vcl/Graphics.Pas -- Line 5837
 
感谢两位老师的回答,我想做的事是这样的:
单色BMP图象存贮的是一串数字信息,比如:12345,我需要将各数字分隔,
我采用的方法是:因为单色BMP图象的图象数据白色用1表示,黑色用0表示,
在BMP图象中数字之间有一段间隙,间隙为白色,如果我从上自下一列扫描的图象数据都为1,
那么我知道这是数字之间的间隔,我就分割图象。并得到每一块图象的颜色编码。

现在的问题是我不知道这种列扫描方法如何用程序实现,不知各位老师能否给俺一段代码?
谢谢。
 
怎么没人愿意回答吗?分少可再加200分。
小弟对图象处理一概不知,请高手指点。
单色图片是扫描的身份证号码。我必须得到图象颜色编码。
因为在单色BMP图象中1代表白色,0代表黑色,所有我必须读出各象素点的颜色值(0/1),
然后进行编码。
所有请大师指点如何逐点读出各象素的值(0/1)
谢谢!!!
 
for x:= 0 to Bmp.Width -1 do
for y:= 0 to bmp.Height -1 do
begin
if bmp.canvas.pixel[x,y] = 1 then
begin //white
end
else //black
begin
end
end;
 
function IsEmpty(Bmp: TBitmap; Line: Integer): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to Bmp.Height - 1 do
if PByteArray(Bmp.ScanLine)[Line] = 0 then begin
Result := False;
Exit;
end;
end;

procedure FindColumn(Bmp: TBitmap; var First, Last: Integer);
begin
while (First < Bmp.Width) and IsEmpty(Bmp, First) do
Inc(First);
Last := First;
while (Last < Bmp.Width) and not IsEmpty(Bmp, Last) do
Inc(Last);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Res, Bmp: TBitmap;
Count, First, Last: Integer;
begin
Bmp := TBitmap.Create;
Res := TBitmap.Create;
try
Bmp.LoadFromFile('e:/myfiles/12345.bmp');
Bmp.PixelFormat := pf8Bit;
Count := 1;
First := 0;
repeat
FindColumn(Bmp, First, Last);
if First = Last then Break
else begin
Res.Width := Last - First + 1;
Res.Height := Bmp.Height;
Res.Canvas.CopyRect(
Rect(0, 0, Res.Width, Res.Height),
Bmp.Canvas,
Rect(First, 0, Last + 1, Res.Height));
Res.SaveToFile('e:/myfiles/' + IntToStr(Count) + '.bmp');
Inc(Count);
First := Last + 1;
end;
until False;
finally
Bmp.Free;
Res.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部