for(i=height-1;i>=height-count;i--)此句如何转为delphi程序? ( 积分: 200 )

  • 主题发起人 主题发起人 rzqcjwrz
  • 开始时间 开始时间
R

rzqcjwrz

Unregistered / Unconfirmed
GUEST, unregistred user!
for(i=height-1;i>=height-count;i--)此句如何转为delphi程序?
 
for(i=height-1;i>=height-count;i--)此句如何转为delphi程序?
 
for downto do
begin
//语句
end;
再看看!
 
var
i:integer;
begin
for i:=height-1 downto height-count do
begin
//i 递减使用downto关键字,如果递增使用to关键字

end;

end;
 
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;

procedure TMyPicture.Button16Click(Sender: TObject);
begin
PictureTwoValue(image1.Picture.Bitmap);
// 调用二值化位图的过程
LevelProjection(image1.Picture.Bitmap, True);
// 调用水平投影的过程
self.Invalidate;
image1.Refresh;
end;

为什么会出此错误:“scan line index out of range”
 
谢谢:senfore 和孤云!!!
 
请senfore 和孤云帮我继续解答,谢谢!!!
 
你把 for x := 0 To count - 1 do 该成 for x := 1 to count do 来执行。
ScanLine[X]; X从1开始。count 代表行。
 
for X := 0 to bitmap.Width - 1 do
begin
P := newbmp.ScanLine[X];
Q := bitmap.ScanLine[X];

应该是for X := 0 to bitmap.Height- 1 do
scanline读的是横着的行。
 
我试了,也是同样错误。
 
调试一下看看哪儿出错啊。反正0 to bitmap.Height- 1这是肯定没错的。
 
请高手帮助解决!!!
 
宁可再作一个旧库的导出程序,也别继续错下去了,不然数据多了想改更麻烦。
 
我是根据C++程序转的.
///////////////////////////////////////////////////////////////////////////////
// 水平方向直方图
////////////////////////////////////////////////////////////////////////////////
void CFaceDetectDlg::OnBtnHistogramH()
{
if(!method1->m_bBinaryReady)
{
AfxMessageBox("请先计算二值图");
return;
}
m_bShowFace = false;
SetCursor(LoadCursor(NULL,IDC_WAIT));
for(int j=0; j<m_nWndWidth; j++)
{
int count = 0;
for(int i=0; i<m_nWndHeight; i++)
{
if(method1->m_pBinaryArray[j] == 1) count++;
m_tResPixelArray[j].rgbBlue = m_tResPixelArray[j].rgbGreen =
m_tResPixelArray[j].rgbRed = 255;
}
for(i=m_nWndHeight-1; i>=m_nWndHeight-count;i--)
{
m_tResPixelArray[j].rgbBlue = m_tResPixelArray[j].rgbGreen =
m_tResPixelArray[j].rgbRed = 0;
}
}
MakeBitMap();
SetCursor(LoadCursor(NULL,IDC_ARROW));
}
 
{
如下测试通过,未出问题,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;
 
dawnsong:您的帮助,非常感谢,但不是图像的水平方向直方图。
 
楼主是想把竖直方向的直方图映射为水平方向的直方图么?
 
for(int j=0; j<m_nWndWidth; j++)
{
int count = 0;
for(int i=0; i<m_nWndHeight; i++)
{//统计纵向一条线上黑色点的数目
if(method1->m_pBinaryArray[j] == 1) count++;
m_tResPixelArray[j].rgbBlue = m_tResPixelArray[j].rgbGreen =
m_tResPixelArray[j].rgbRed = 255;
}//从底部开始画黑色点,构成一条黑线
for(i=m_nWndHeight-1; i>=m_nWndHeight-count;i--)
{
m_tResPixelArray[j].rgbBlue = m_tResPixelArray[j].rgbGreen =
m_tResPixelArray[j].rgbRed = 0;
}
}
这段代码看起来好像也实现不了楼主的功能要求哦?
这段代码应该是 “把不在底部的竖直直方图挪动到底部而已吧”?
 
对一张图作水平方向的直方图。
 
for i:=height-1 downto height-count do
begin
//循环体
end;
要做矩阵的转置,去查查算法方面的书吧。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部