将 TPanel 绘制到图像并将其保存在数据集中

Posted

技术标签:

【中文标题】将 TPanel 绘制到图像并将其保存在数据集中【英文标题】:Paint a TPanel to an Image and save it in dataset 【发布时间】:2013-06-30 15:30:04 【问题描述】:

我有一个面板 (TPanel),它是在运行时创建的其他许多面板的父级。我想将所有这些都像图像(位图,图形,无论如何..)一样保存到数据存储中。我用过这个:

image1.Picture:= nil;
panel1.PaintTo(image1.Canvas.Handle,0,0);
table1.edit;
table1.FieldByName('Im').Assign(image1.Picture.Bitmap);    
table1.Post;

还有这个:

var
Bitmap: TBitmap;
BmpField: TGraphicField;
begin
BmpField := table1.FieldByName('Im') as TGraphicField;
Bitmap := TBitmap.Create;
try
Bitmap.Width := Panel1.Width;
Bitmap.Height := Panel1.Height;
Panel1.PaintTo(Bitmap.Canvas.Handle, 0, 0);
table1.Edit;
BmpField.Assign(Bitmap);
table1.Post;
finally
Bitmap.Free;
end;
end;

感谢Ken White,这两种方法都有效,但是...当我将数据集保存为 .xml 并在文本编辑器中打开该 .xml 时,保存在那里的图像是一个无限字符串(不大,但无限!)。 有没有办法像数据库中的普通图像一样保存这个面板(里面有面板),并且保存的 .xml 字符串是一个像样的字符串?谢谢。

【问题讨论】:

【参考方案1】:

我在另一篇文章中解释了这一点。必须对图像进行编码(转换为二进制以外的内容)才能写入 XML。它不是“无限的”。这是编码的图像。您不能将二进制图像存储为 XML 中的实际图像。这一个体面的。 :-)

您能解释一下您的实际目标是什么吗?该图像在 XML 的图形字段中非常好。 (你可以在那里写然后检索它并显示在TImage,对吗?)我不明白你为什么一直想读取二进制数据库字段作为字符串; 不是字符串。它是一个包含图形图像的二进制字段。一张绿色草地的字符串图片会是什么样子?

【讨论】:

是的。图像很好,可以使用 TImage 读取。我唯一担心的是,当我保存该文件中仅存储 1 个图像的“xml”文件时,该文件有 2.7kb,而内部存储更多图片的 biolife.xml 文件(在 delphi 的演示中)只有 1.4kb。 这是正常的,还是我做错了什么?我的问题是,只需将 TComponent 绘制到图像上就可以了,还是我必须做更多的事情? Biolife 中的图像可能颜色深度较低(每像素位数),因此更小,因为它们是很久以前在 Windows 3.1 天 IIRC 中创建的。 (我认为在 Delphi 1 发布时 Biolife 最初是在 Paradox 数据库中,然后在 Delphi 5 左右才转换为 ClientDataSet。)如果您可以保存然后重新加载图像,那么您没有做错任何事情。跨度> 好的。结案。非常感谢。

以上是关于将 TPanel 绘制到图像并将其保存在数据集中的主要内容,如果未能解决你的问题,请参考以下文章

python 在pygame中绘制TMX图块并将其保存为图像

在 ipad 应用程序中绘制签名并将其转换为图像

如何在不使用画布的情况下将整个 div 数据转换为图像并将其保存到目录中?

将图像保存到核心数据中并将其提取到 tableview 单元格中

保存的 EPS 图像与绘制的图表不同

如何上传图像并将其保存在数据库中? [复制]