Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
图片数据库,TDBImages,TImageList,Delphi_Image_Delphi_Jpeg_Delphi 2010_Timagelist - Fatal编程技术网

图片数据库,TDBImages,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上

我正在写一个显示图片(地图)的程序。当你点击图片的一部分时,它必须放大。共有26张图片(包括主图片)。我想将这些图片加载到Delphi中,并用游乐园.jpg替换Image1(Whole_map.jpg)

我想使用高质量的jpg而不是位图:( *是否可以将这26幅图像加载到TImageList中,并且仍然使用具有其质量的图像 或 *我可以将图像保存在某种数据库中并将其加载到Delphi中吗

没有帮助,因为我不想使用位图。
我也不想使用任何第三方组件,因为该程序必须在默认的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…或者如果这些类提供了一些扩展功能,而这些扩展功能被其他应用程序使用,那么终止您的应用程序可能会导致挂起另一个应用程序。为什么?因为这些类不会被销毁,它们将没有机会通知其他应用程序它们将无法再工作。因此其他应用程序你可能只是在不确定地等待某个结果,然后挂起。不管怎样,有很多案例可以写在这里。它再次继续。。。