2014-11-17 3 views
0

В Delphi У меня есть неизвестное количество имен файлов изображений, хранящихся в таблице подробностей. Эти файлы изображений могут быть растровыми, Jpeg, PNGS и ICO-файлами.Отображение изображений с db на ходу

Что такое парадигма/передовая практика для загрузки и отображения в списке или списке на ходу?
Я так понимаю, мне нужно было бы загрузить их в ImageList в событие OnBeforeScroll главной таблицы, а затем назначить это в listview. Компонентами базы данных являются dbGO.

Мне нужно отображать только миниатюры предопределенного размера (в программе VCL).

+2

Какая часть проблемы для вас? Загрузка файлов в TPicture? , добавив Bitmap в изображение? отслеживание между imagelist и Dataset/Listview/Listbox? – bummi

+0

@bummi Все вышесказанное, к сожалению. –

+0

@bummi На самом деле ваш комментарий в значительной степени отвечает на мой вопрос. Поэтому я предполагаю, что мне понадобится создать экземпляр TPicture, загрузить из файла, добавить его в изображение и повторить для каждой записи таблицы деталей. Если бы вы могли расширить свой комментарий в ответ, я бы с радостью принял его. –

ответ

3

Самый простой способ - использовать TPicture, поскольку загрузка различных графических форматов уже реализована, и вам нужно заботиться о разных классах изображений.
Вы должны убедиться, что требуемые единицы включены в приложение, которое используется здесь, например. jpeg, gifimg и pngimg.
После загрузки с помощью TPicture.LoadFromFile изображения покрашены, центрированы и масштабированы на подготовленном растровом изображении с размерами Imagelist.
Последний шаг - просто вызвать процедуру AddBitmap с помощью Bitmap и nil для маски.

// make sure you included the needed units 
// uses pngImage,jpeg,gifimg; 

Procedure LoadImagesFromDataset2ImageList(il: TImageList; DS: TDataset; const FileFieldname: String); 
var 
    P: TPicture; 
    bmp: TBitmap; 

    Function CalcRectAndPrepare: TRect; // calculate Rect for here centered/streched output 
    var // and fill the bitmap with the desired beckground color 
    f: Double; 
    begin 
    bmp.Canvas.Brush.Color := clWhite; 
    bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height)); 
    if P.Width > P.Height then 
     f := bmp.Width/P.Width 
    else 
     f := bmp.Height/P.Height; 
    Result.Left := Round(bmp.Width - P.Width * f) div 2; 
    Result.Top := Round(bmp.Height - P.Height * f) div 2; 
    Result.Right := bmp.Width - Result.Left; 
    Result.Bottom := bmp.Height - Result.Top; 
    end; 

begin 
    P := TPicture.Create; 
    bmp := TBitmap.Create; 
    try 
    bmp.Width := il.Width; 
    bmp.Height := il.Height; 
    DS.First; 
    while not DS.Eof do 
    begin 
     if FileExists(DS.Fieldbyname(FileFieldname).asString) then 
     begin 
     P.LoadFromFile(DS.Fieldbyname(FileFieldname).asString); 
     bmp.Canvas.StretchDraw(CalcRectAndPrepare, P.Graphic); 
     il.Add(bmp, nil); 
     end; 
     DS.Next; 
    end; 
    finally 
    P.Free; 
    bmp.Free; 
    end; 
end; 
+0

Отлично, только то, что я хотел знать. –

1

«Неизвестный номер» звучит так, будто может быть огромное количество изображений. Таким образом, предварительные рендеринговые эскизы будут очень полезны. Если ваше приложение может создавать эскизы для всех изображений и хранить их в отдельной базе данных, это уменьшит использование ресурсов ЦП для их сокращения. И вы можете ссылаться на базу данных миниатюр из вашей основной базы данных.

Одна вещь, которую я хотел бы проверить, если RAM может быть ограничение сколько экземпляров фактического эскиза будет создан в приложении, например, при загрузке 1000 записей базы данных, которые все относятся к же миниатюру, делает компонент доступа к базе данных выделяет 1000 объектов изображения (используя в 1000 раз больше ОЗУ, чем необходимо) или только один, на который ссылаются 1000 раз. Также важно де-распределение данных изображения.

+0

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

Смежные вопросы