Delphi DrawGrid仅显示第一个图像
我想在TDrawGrid中显示图像列表。在下面的示例中,“我的DrawGrid”仅显示1个图像,它是第一个图像。其他两个图像不显示在网格中。网格的行数为3,列数为1 这段代码在位图的移位区域绘制jpeg,所以您无法看到它 在位图活动区域中定义矩形。可能的方式:Delphi DrawGrid仅显示第一个图像,delphi,Delphi,我想在TDrawGrid中显示图像列表。在下面的示例中,“我的DrawGrid”仅显示1个图像,它是第一个图像。其他两个图像不显示在网格中。网格的行数为3,列数为1 这段代码在位图的移位区域绘制jpeg,所以您无法看到它 在位图活动区域中定义矩形。可能的方式: R.Top := 0; R.Left := 0; R.Right := 73; R.Bottom := 73; Bmp.Canvas.StretchDraw(R, JImg); OffsetRect(R, Rec
R.Top := 0;
R.Left := 0;
R.Right := 73;
R.Bottom := 73;
Bmp.Canvas.StretchDraw(R, JImg);
OffsetRect(R, Rect.Left + 1, Rect.Top + 1);
DrawGrid1.Canvas.StretchDraw(R, Bmp);
这段代码在位图的移位区域绘制jpeg,所以您无法看到它
在位图活动区域中定义矩形。可能的方式:
R.Top := 0;
R.Left := 0;
R.Right := 73;
R.Bottom := 73;
Bmp.Canvas.StretchDraw(R, JImg);
OffsetRect(R, Rect.Left + 1, Rect.Top + 1);
DrawGrid1.Canvas.StretchDraw(R, Bmp);
您正在使用错误的TRect值将TJPEG图像绘制到TBitmap上。您使用的值是相对于栅格的,而不是相对于TBitmap的,因此第二个和后续图像是在TBitmap的边界之外绘制的
您需要使用类似以下内容:
程序DrawGrid1DrawCellSender:ToObject;ACol,ARow:整数;
ARect:TRect;州:TGR州;
变量
Bmp:TBitmap;
R:TRect;
JImg:tjpeg图像;
开始
JImg:=TJPEGImage.Create;
尝试
JImg.LoadFromFileFormat'c:\tmp\photo%d.jpeg',[ARow+1];
Bmp:=TBitmap.Create;
尝试
Bmp.PixelFormat:=pf24位;
宽度:=73;
高度:=73;
R:=Rect0,0,Bmp.Width,Bmp.Height;
Bmp.Canvas.StretchDrawR,JImg;
右偏左,右上;
DrawGrid1.Canvas.StretchDrawR,Bmp;
最后
Bmp.Free;
终止
最后
免费;
终止
终止
但是,实际上根本不需要TBitmap,因为您可以直接将TJPEG图像绘制到网格的画布上:
程序DrawGrid1DrawCellSender:ToObject;ACol,ARow:整数;
ARect:TRect;州:TGR州;
变量
R:TRect;
JImg:tjpeg图像;
开始
JImg:=TJPEGImage.Create;
尝试
JImg.LoadFromFileFormat'c:\tmp\photo%d.jpeg',[ARow+1];
R:=Rect0,0,73,73;
右偏左+1,右偏上+1;
DrawGrid1.Canvas.StretchDrawR,JImg;
最后
免费;
终止
终止
也就是说,每次在屏幕上重新绘制网格时,此代码都会重新加载.jpeg文件。您应该一次性加载文件并缓存图像,例如在TImageList中。或者干脆不使用TDrawGrid。例如,您可以将一系列TImage控件放置在TScrollBox上,然后将.jpeg文件加载到TImage控件中,让它们为您处理绘图。您正在使用错误的TRect值将TJPEG图像绘制到TBitmap上。您使用的值是相对于栅格的,而不是相对于TBitmap的,因此第二个和后续图像是在TBitmap的边界之外绘制的 您需要使用类似以下内容: 程序DrawGrid1DrawCellSender:ToObject;ACol,ARow:整数; ARect:TRect;州:TGR州; 变量 Bmp:TBitmap; R:TRect; JImg:tjpeg图像; 开始 JImg:=TJPEGImage.Create; 尝试 JImg.LoadFromFileFormat'c:\tmp\photo%d.jpeg',[ARow+1]; Bmp:=TBitmap.Create; 尝试 Bmp.PixelFormat:=pf24位; 宽度:=73; 高度:=73; R:=Rect0,0,Bmp.Width,Bmp.Height; Bmp.Canvas.StretchDrawR,JImg; 右偏左,右上; DrawGrid1.Canvas.StretchDrawR,Bmp; 最后 Bmp.Free; 终止 最后 免费; 终止 终止 但是,实际上根本不需要TBitmap,因为您可以直接将TJPEG图像绘制到网格的画布上: 程序DrawGrid1DrawCellSender:ToObject;ACol,ARow:整数; ARect:TRect;州:TGR州; 变量 R:TRect; JImg:tjpeg图像; 开始 JImg:=TJPEGImage.Create; 尝试 JImg.LoadFromFileFormat'c:\tmp\photo%d.jpeg',[ARow+1]; R:=Rect0,0,73,73; 右偏左+1,右偏上+1; DrawGrid1.Canvas.StretchDrawR,JImg; 最后 免费; 终止 终止
也就是说,每次在屏幕上重新绘制网格时,此代码都会重新加载.jpeg文件。您应该一次性加载文件并缓存图像,例如在TImageList中。或者干脆不使用TDrawGrid。例如,您可以将一系列TImage控件放置在TScrollBox上,然后将.jpeg文件加载到TImage控件中,让它们为您处理绘图。我在行R上遇到一个错误:=Rect0,0,Bmp.Width,Bmp.Height;{缺少运算符或分号}我使用BMP的原因是调整Jpeg的大小。此外,我不能使用图像列表,因为我的图像是动态的,是由网络摄像头创建的。再次感谢您的回复。您可以将一系列TImage控件放置在TScrollBox上,然后将.jpeg文件加载到TImage控件中,让它们为您处理绘图。这是我最初尝试的,但没有成功。。再次感谢您的帮助。@Lou我遇到一个错误-您是否重命名了Rect参数,如我在示例中所示?Rect是一个函数,但在原始代码中也是一个参数名。避免名称冲突。我使用BMP的原因是调整Jpeg的大小-您所做的只是拉伸JPG
o创建BMP,然后按原样绘制BMP。因此,只需将JPG拉伸到网格上即可。同样的效果,更少的开销。我不能使用图像列表,因为我的图像是动态的-您可以在有新的JPG时更新图像列表。这是我最初尝试的,但没有成功-为什么?我在行R上得到一个错误:=Rect0,0,Bmp.Width,Bmp.Height;{缺少运算符或分号}我使用BMP的原因是调整Jpeg的大小。此外,我不能使用图像列表,因为我的图像是动态的,是由网络摄像头创建的。再次感谢您的回复。您可以将一系列TImage控件放置在TScrollBox上,然后将.jpeg文件加载到TImage控件中,让它们为您处理绘图。这是我最初尝试的,但没有成功。。再次感谢您的帮助。@Lou我遇到一个错误-您是否重命名了Rect参数,如我在示例中所示?Rect是一个函数,但在原始代码中也是一个参数名。避免名称冲突。我使用BMP的原因是调整Jpeg的大小-您所做的只是将JPG拉伸到BMP上,然后按原样绘制BMP。因此,只需将JPG拉伸到网格上即可。同样的效果,更少的开销。我不能使用图像列表,因为我的图像是动态的-您可以在有新的JPG时更新图像列表。这是我最初尝试的,但没有成功——为什么?
R.Top := 0;
R.Left := 0;
R.Right := 73;
R.Bottom := 73;
Bmp.Canvas.StretchDraw(R, JImg);
OffsetRect(R, Rect.Left + 1, Rect.Top + 1);
DrawGrid1.Canvas.StretchDraw(R, Bmp);