图片数据库,TDBImages,TImageList,Delphi
我正在写一个显示图片(地图)的程序。当你点击图片的一部分时,它必须放大。共有26张图片(包括主图片)。我想将这些图片加载到Delphi中,并用游乐园.jpg替换Image1(Whole_map.jpg) 我想使用高质量的jpg而不是位图:( *是否可以将这26幅图像加载到TImageList中,并且仍然使用具有其质量的图像 或 *我可以将图像保存在某种数据库中并将其加载到Delphi中吗 没有帮助,因为我不想使用位图。图片数据库,TDBImages,TImageList,Delphi,image,delphi,jpeg,delphi-2010,timagelist,Image,Delphi,Jpeg,Delphi 2010,Timagelist,我正在写一个显示图片(地图)的程序。当你点击图片的一部分时,它必须放大。共有26张图片(包括主图片)。我想将这些图片加载到Delphi中,并用游乐园.jpg替换Image1(Whole_map.jpg) 我想使用高质量的jpg而不是位图:( *是否可以将这26幅图像加载到TImageList中,并且仍然使用具有其质量的图像 或 *我可以将图像保存在某种数据库中并将其加载到Delphi中吗 没有帮助,因为我不想使用位图。 我也不想使用任何第三方组件,因为该程序必须在默认的Delphi 2010上
我也不想使用任何第三方组件,因为该程序必须在默认的Delphi 2010上运行。如我的文章中所述,您可以创建一个TJPEGImage对象数组来存储图像 你这样做:
//Global array for storing images
var Images: Array [1..26] of TJPEGImage;
implemenetation
...
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
begin
for I := 1 to 26 do
begin
//Since TJPEGIMage is a class we first need to create each one as array only
//stores pointer to TJPEGImage object and not the object itself
Images[I] := TJPEGImage.Create;
//Then we load Image data from file into each TJPEGImage object
//If file names are not numerically ordered you would probably load images
//later and not inside this loop. This depends on your design
Images[I].LoadFromFile('D:\Image'+IntToStr(I)+'.jpg');
end;
end;
正如您在source coments中看到的,数组只存储指向TJPEGImage对象的指针,而不存储TJPEGImage对象本身的指针。因此,在尝试将任何图像数据加载到这些对象之前,不要忘记创建它们。否则将导致访问冲突
另外,由于您自己创建了这些TJPEGImage对象,因此您还需要自己释放它们,以避免可能的内存泄漏
procedure TForm1.FormDestroy(Sender: TObject);
var I: Integer;
begin
for I := 1 to 26 do
begin
Images[I].Free;
end;
end;
要在TImage组件中显示这些存储的图像,请使用
//N is array index number telling us which array item stores the desired image
Image1.Picture.Assign(Images[N]);
您可以使用的第二种方法
现在,由于TJPEGImage是分类对象,您还可以使用TObjectList存储指向它们的指针。
在这种情况下,创建代码如下所示
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
Image: TJPEGImage;
for I := 1 to NumberOfImages do
begin
//Create TObject list with AOwnsObjects set to True means that destroying
//the object list will also destroy all of the objects it contains
//NOTE: On ARC compiler destroying TObjectList will only remove the reference
//to the objects and they will be destroyed only if thir reference count
//drops to 0
Images := TObjectList.Create(True);
//Create a new TJPEGImage object
Image := TJPEGImage.Create;
//Load image data into it from file
Image.LoadFromFile('Image'+IntToStr(I)+'.jpg');
//Add image object to our TObject list to store reference to it for further use
Images.Add(Image);
end;
end;
您现在可以这样显示这些图像
//Note becouse first item in TObject list has index of 0 you need to substract 1
//from your ImageNumber
Image1.Picture.Assign(TJPEGImage(Images[ImageNumber-1]));
由于我们将TObjectList设置为拥有TJPEGImage对象,因此可以像这样快速销毁所有对象
//NOTE: On ARC compiler destroying TObjectList will only remove the reference
//to the objects and they will be destroyed only if thir reference count
//drops to 0
Images.Free;
关于数据库部分,我不确定您是否应该在本例中使用
TImageList
来存储(高分辨率?)图像(而不是图标)。请创建并使用通用TObjectList
。为什么不创建TJpegImage的数组并在每个TJpegImage中存储单个图像。@SilverWarior我已经创建了一个数组arrPics:array[1..26]的TJPEGImage;
如何向其中添加图像?我已尝试加载位置名称(字符串)进入数组,但它不起作用。如果你没有提供一些代码说明你是如何做到的,很难说为什么它不起作用。非常感谢兄弟!我使用了第一种方法,它工作得很好。一点主题…你说我需要释放它过程TForm1.FormDestroy(发件人:TObject);var I:Integer;begin for I:=1到26 do begin Images[I]。Free;end;end;
我不理解我的效果?由于coment/s的大小限制,使用coment/s来解释这一点并不容易,但我会尝试。首先,您需要了解组件和常规类之间的区别(组件是特殊类)。当您创建一个组件时,您会在创建过程中为其分配一个所有者。因此,现在当所有者被销毁时,它会通知其拥有的所有组件,这样它们也会销毁自己(释放自己的内存)。因此,对于组件,您无需特别注意,除非您将所有者设置为lill(无所有者)在他们创建时。它会继续…但是当你在你的情况下创建其他类,如TJPEGImage,你不能为他们指定所有者,这意味着当他们需要销毁自己时,他们不会得到通知,除非你为他们中的每一个调用free。这意味着他们永远不会释放他们正在使用的内存。例如scenario被称为“内存泄漏”。现在,在您的特定情况下,不释放TJPEGImage对象不会造成太多问题,因为它们的内存在应用程序终止时会被释放。它将再次继续…但如果这些是以不同方式处理内存的其他类,则可能会导致某些内存即使在应用程序终止时也不会被释放。这是不好的,因为它可能会导致操作系统内存不足,因为操作系统仍然认为该部分内存需要保留。现在,如果这些类正在启动硬盘上soem文件的句柄,则可能会出现更严重的问题,因为即使在应用程序终止后,操作系统仍可能将该文件视为仍处于打开状态。它继续再次nues…或者如果这些类提供了一些扩展功能,而这些扩展功能被其他应用程序使用,那么终止您的应用程序可能会导致挂起另一个应用程序。为什么?因为这些类不会被销毁,它们将没有机会通知其他应用程序它们将无法再工作。因此其他应用程序你可能只是在不确定地等待某个结果,然后挂起。不管怎样,有很多案例可以写在这里。它再次继续。。。