我的应用程序有3个控件:TThumbnailList(来自TMS组件的图像查看器),TImage和TLabel。我希望当我将图像从TThumbnailList拖到TImage并将其删除时,TLabel对象会显示该图像的大小(以字节为单位)。我怎么得到这个? 提前谢谢。
procedure TForm1.AssignImage;
begin
//tl: TThumbnailList
if (tl.ItemIndex>=0) then begin
Image1.Picture.Assign(tl.Thumbnails.Items[tl.ItemIndex].Picture);
end;
end;
procedure TForm1.Image1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Source is TThumbnailList) then AssignImage;
end;
procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
Accept:= Source is TThumbnailList;
end;
答案 0 :(得分:2)
TImage没有任何方法可以确定在给定时间碰巧保持的任何图形的大小。那不是它的工作。它的工作只是显示的东西。 TGraphic对象管理内存中表示,它还确定如何将自身绘制到给定的画布上。 TImage真的一无所知。 TGraphic可能,但它不一定跟踪文件大小;这可能与将数据存储在内存中所需的内存量不同。
确定文件大小的方法是具有文件或类似文件的内容,例如流。正如您在评论中提到的,您可以将图像保存为流,然后找出流的大小。
function GetGraphicSize(g: TGraphic): Integer;
var
ms: TStream;
begin
ms := TMemoryStream.Create;
try
g.SaveToStream(ms);
Result := ms.Size;
finally
ms.Free;
end;
end;
如果每次需要大小时计算成本太高,那么请记住第一次看到图像时的大小,这样您每次都不需要重新计算它。缩略图列表是如何开始其图像的?如果它们来自文件,那么您可以在生成缩略图时简单地获取文件大小。
答案 1 :(得分:1)
您可以使用以下功能执行文件搜索并返回大小。
function FindFileSize(Filename:string):integer;
var
sr : TSearchRec;
begin
if FindFirst(filename,faAnyFile-faDirectory,sr) = 0 then
Result := sr.Size
else
raise EFileNotFoundException.Create(filename+' not found.');
FindClose(sr);
end;
答案 2 :(得分:1)
// this will return the size of the bitmap in bytes!
function BitmapSize(ABitmap: TBitmap): Cardinal;
var ms : TMemoryStream;
begin
ms := TMemoryStream.Create;
ABitmap.savetostream(ms);
result := ms.size;
FreeAndNil(ms);
end;
玩得开心,如果答案有帮助,请不要忘记访问http://delphigeist.blogspot.com/!