JohnsonGuo兄请来取分(其他高手也请帮忙指点)!(200分)

  • 主题发起人 主题发起人 sundart
  • 开始时间 开始时间
S

sundart

Unregistered / Unconfirmed
GUEST, unregistred user!
JohnsonGuo兄你好:150分我已经送上,我准备再追加200分给兄台,下面我还有几个问题请教。
(原问题:紧急求助:如何读出单色BMP图象的图象数据(不要控件),请大师给出原代码?)
单色图片是扫描的身份证号码。我必须将各数字分割开,并得到图象颜色编码。
下面是你给我的程序,我用了,挺不错的,能将我的数字正确分割,但是我想只取数字部分,其余空白
部分删除。不知兄台能否指点一番。另外PByteArray(Bmp.ScanLine)[Line]表示什么意思?
Bmp.PixelFormat := pf8Bit;为什么要设为8位,我取较低值(比如2位)分割的数字都不准确?
谢谢!!!
程序如下:
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;

 
怎么没有人回答?大侠们是不是看见:“JohnsonGuo兄请来取分”,以为回答了我会不给分,
请放心,Johnsonguo兄200分属追加(因为他回答了一个问题,我答应加200$),这个问题谁回答了都加200$。
 
"只取数字部分,其余空白部分删除"是指什么?

Bmp.PixelFormat := pf8Bit是把图像强制转换成256色(即8位色)
这样处理起上来比较方便读一个字节即可知道其是白色还是黑色。
不用再另设代码处理位操作。

至于PByteArray(Bmp.ScanLine)[Line]这句,建议你看一个TBitmap.ScanLine
帮助中的例子便会明白。
 
PByteArray(Bmp.ScanLine)[Line]表示bmp的第 i 行第 line 列。
这个程序是对图片进行左右方向的扫描并将图中为亮度为 0 的列选出来,
你只要将选出来的图在上下方向扫一次就可以了。
你用其他的PIXELSFORMAT进行转换有可能将你的数字部分的亮度转换成并
不是 0 ,而可能是 1 ,(在2bit的情况下),而且其他的部分也可能
会被转换为 0 ,所以造成识别有问题。



 
//"只取数字部分,其余空白部分删除"是指什么?
扫描的图象来自身份证,除身分证号码外,其周围还有白色底边,我想要数字所占的那部分
图象,将其白色边缘去掉。请问怎么办?
 
是指只取得包含数字的最小矩形框吗?
 
接受答案了.
 
后退
顶部