procedure TMyPicture.LevelProjection(Bitmap: TBitmap; Level: Boolean);
var
X, Y, i, j: integer;
P, Q: pByteArray;
newbmp: TBitmap;
number: integer;
begin
newbmp := TBitmap.Create;
// 动态创建TBitmap对象
newbmp.Width := bitmap.Width;
newbmp.Height := bitmap.Height;
//原位图的高度和宽度赋给新的位图
newbmp.Assign(bitmap);
// 拷贝位图到newbmp
if (Level) then //Level为真表示进行水平投影
begin
for X := 0 to bitmap.Width - 1 do
begin
P := newbmp.ScanLine[X];
Q := bitmap.ScanLine[X];
number := 0;
// 设置每一列扫描的初值
for Y := 0 to bitmap.Height - 1 do
begin
if ((Q[3 * Y + 2] = 255) and (Q[3 * Y + 1] = 255) and (Q[3
* Y] = 255)) then
number := number + 1;
// 统计每一行的白色点的数目,记录为number
end;
for i := 0 to number do
begin
P[3 * i] := 0;
P[3 * i + 1] := 0;
P[3 * i + 2] := 0;
end;
// 从上面开始,给一列number个像素点涂上黑色
for j :=bitmap.Height - 1 downto bitmap.Height - number do
begin
P[3 * j] := 255;
P[3 * j + 1] := 255;
P[3 * j + 2] := 255;
end;
// 其他点涂白色
end;
bitmap.Assign(newbmp);
newbmp.Free;
end;
end;
{
如下测试通过,未出问题,delphi9
具体要实现什么效果就不知了,其中更改了ScanLine部分的循环
}
var bmp:TBitmap;
procedure LevelProjection(Bitmap: TBitmap; Level: Boolean);
var
X, Y, i, j: integer;
P, Q: pByteArray;
newbmp: TBitmap;
number: integer;
begin
newbmp := TBitmap.Create;
// 动态创建TBitmap对象
newbmp.Width := bitmap.Width;
newbmp.Height := bitmap.Height;
//原位图的高度和宽度赋给新的位图
newbmp.Assign(bitmap);
// 拷贝位图到newbmp
if (Level) then //Level为真表示进行水平投影
begin
for y := 0 to bitmap.Height - 1 do
begin
P := newbmp.ScanLine[y];
Q := bitmap.ScanLine[y];
number := 0;
// 设置每一列扫描的初值
for x := 0 to bitmap.Width - 1 do
begin
if ((Q[3 * x + 2] = 255) and (Q[3 * x + 1] = 255) and (Q[3
* x] = 255)) then
number := number + 1;
// 统计每一行的白色点的数目,记录为number
end;
for i := 0 to number do
begin
P[3 * i] := 0;
P[3 * i + 1] := 0;
P[3 * i + 2] := 0;
end;
// 从上面开始,给一列number个像素点涂上黑色
for j :=bitmap.Width - 1 downto bitmap.Width - number do
begin
P[3 * j] := 255;
P[3 * j + 1] := 255;
P[3 * j + 2] := 255;
end;
// 其他点涂白色
end;
bitmap.Assign(newbmp);
newbmp.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
bmp :=TBitmap.Create;
bmp.LoadFromFile('../无标题.bmp');
Image1.Canvas.StretchDraw(Image1.ClientRect,bmp);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bmp.Destroy;
end;
procedure TForm1.Image1DblClick(Sender: TObject);
begin
LevelProjection(bmp,True);
Image1.Canvas.StretchDraw(Image1.ClientRect,bmp);
end;