Загрузка изображений в 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;
Другие вопросы по тегам