Загрузка изображений в TImageList и их чтение?
Я пытаюсь загрузить jpg в список изображений, преобразовав файл.jpg в bmp, а затем сохранив его в imagelist1.
Сверху вниз отрывок кода. Selectdir работает, а файл существует, части работают. Это используется для загрузки всех изображений в папке. Все изображения имеют такие имена, как 0.jpg / 1.jpg и т. Д.
Затем я загружаю JPG в картинку. Установите ширину / высоту bmp и загрузите bmp с тем же изображением, что и jpg, затем я добавлю bmp в список изображений. И когда это будет сделано, он должен показать первое изображение 0.jpg
Два вопроса, во-первых, если бы я сделал это так, он бы показывал только небольшую область (вверху слева) bmp, но это было правильное изображение. Я предполагаю, что это связано с опцией урожая. который я не могу понять, как заставить его выбрать центр во время выполнения?
Во-вторых, если я положу
Imagelist1.width := currentimage.width;
Imagelist1.height := currentimage.height;
Затем он показывает последнее изображение. лайк Imagelist1.GetBitmap()
не работал? поэтому я предполагаю, что исправление для любого из них было бы замечательно! ура squills
procedure TForm1.Load1Click(Sender: TObject);
var
openDialog : TOpenDialog;
dir :string;
MyPicture :TPicture;
currentimage :Tbitmap;
image : integer;
clTrans : TColor;
begin
Image := 0 ;
//lets user select a dir
SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP);
myPicture :=Tpicture.Create;
currentimage := TBitmap.Create;
//keeps adding images as long as the file path exsist.
//thus comic pages should be renumbed to 0-XX
while FileExists(Dir+'\'+inttostr(image)+'.jpg') do
begin
try
MyPicture.LoadFromFile(Dir+'\'+inttostr(image)+'.jpg'); //load image to jpg holder
currentimage.Width := mypicture.Width; //set width same as jpg
currentimage.Height:= mypicture.Height; //set height same as jpg
currentimage.Canvas.Draw(0, 0, myPicture.Graphic); //draw jpg on bmp
clTrans:=currentimage.TransparentColor; //unknown if needed?
//Imagelist1.Width := currentimage.Width;
//imagelist1.Height := currentimage.Height;
Imagelist1.Addmasked(Currentimage,clTrans); //add to imagelist
finally
image := image +1; //add one so it adds next page
end;
end;
ImageList1.GetBitmap(0,zImage1.Bitmap);
mypicture.Free;
currentimage.Free;
end;
1 ответ
Вы добавляете много ненужных накладных расходов, используя TImage
каждый раз.
Попробуйте что-то вроде этого (не проверено, потому что у меня нет папки с изображениями, названной таким образом - она компилируется, хотя Jpeg
к вашей реализации uses
оговорка, если его там еще нет, конечно.
procedure TForm2.Button1Click(Sender: TObject);
var
DirName: string;
begin
DirName := 'D:\Images';
if SelectDirectory('Select Image Path',
'D:\TempFiles',
DirName,
[sdNewUI],
Self) then
LoadImages(DirName);
end;
procedure TForm2.LoadImages(const Dir: string);
var
i: Integer;
CurFileName: string;
JpgIn: TJPEGImage;
BmpOut: TBitmap;
begin
i := 1;
while True do
begin
CurFileName := Format('%s%d.jpg',
[IncludeTrailingPathDelimiter(Dir), i]);
if not FileExists(CurFileName) then
Break;
JpgIn := TJPEGImage.Create;
try
JpgIn.LoadFromFile(CurFileName);
// If you haven't initialized your ImageList width and height, it
// defaults to 16 x 16; we can set it here, if all the images are
// the same dimensions.
if (ImageList1.Count = 0) then
ImageList1.SetSize(JpgIn.Width, JpgIn.Height);
BmpOut := TBitmap.Create;
try
BmpOut.Assign(JpgIn);
ImageList1.Add(BmpOut, nil);
finally
BmpOut.Free;
end;
finally
JpgIn.Free;
end;
Inc(i);
end;
if ImageList1.Count > 0 then
begin
BmpOut := TBitmap.Create;
try
ImageList1.GetBitmap(0, BmpOut);
Image1.Picture.Assign(BmpOut);
finally
BmpOut.Free;
end;
end;
end;