База данных изображений, TDBImages, TImageList, Delphi

Я пишу программу, которая показывает картинку (карту). когда вы нажимаете на часть изображения, она должна увеличиваться. Всего 26 изображений (включая основную картинку). Я хочу загрузить эти картинки в Delphi и заменить Image1(Whole_map.jpg) на Amusement_park.jpg.

Я хочу использовать JPG хорошего качества, а не растровые изображения:( * Можно ли загрузить эти 26 изображений в TImageList и при этом использовать изображения с их качеством или * Могу ли я сохранить изображения в какой-либо базе данных и загрузить их в Delphi

Загрузка изображений и преобразование в растровое изображение не помогает, потому что я не хочу использовать растровые изображения. Я также не хочу использовать какие-либо сторонние компоненты, потому что эта программа должна работать на Delphi 2010 по умолчанию.

1 ответ

Решение

Как упоминалось в моем комментарии, вы можете создать массив объектов 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;

Как вы видите в исходных комментариях, массив хранит только указатели на объекты 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;
Другие вопросы по тегам