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
Delphi 不同大小的图像加载到TImageList_Delphi - Fatal编程技术网

Delphi 不同大小的图像加载到TImageList

Delphi 不同大小的图像加载到TImageList,delphi,Delphi,iam加载的图像大小略有不同。我怎样才能得到最小的尺寸并将它们全部重新调整到该尺寸 下面的代码是加载图像->转换为bmp->添加到imagelist 大约3个图像后,它会给出错误无效的图像大小。由于图像大小对于我在开始时给出的imagelist的大小来说太大了 procedure TForm1.LoadImages(const Dir: string); var z,i: Integer; CurFileName: string; JpgIn: TJPEGImage; BmpOu

iam加载的图像大小略有不同。我怎样才能得到最小的尺寸并将它们全部重新调整到该尺寸

下面的代码是加载图像->转换为bmp->添加到imagelist

大约3个图像后,它会给出错误无效的图像大小。由于图像大小对于我在开始时给出的imagelist的大小来说太大了

procedure TForm1.LoadImages(const Dir: string);
var
  z,i: Integer;
  CurFileName: string;
  JpgIn: TJPEGImage;
  BmpOut: TBitmap;
begin
  i := 0;
  z := 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 z = 1 then
       begin
        ImageList1.SetSize(jpgin.width, jpgin.Height);
        z := 0;
       end;
      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(1, BmpOut);
      zimage1.Bitmap.Assign(bmpout);
      zimage1.Repaint;
    finally
      BmpOut.Free;
    end;
  end;
end;

一旦开始将图像放入
TImageList
,就无法调整其大小,并且所有图像的大小必须相同。因此,您必须提前预加载所有图像,以便确定可用的最小尺寸,然后将任何较大的图像裁剪/拉伸为较小尺寸,然后将最终图像加载到
TImageList


让您的循环将所有
tjpeg图像
存储到
t列表
TObjectList
中,而不是立即释放它们,然后您可以在该列表中循环计算最小大小,然后根据需要再次循环列表调整图像大小,然后再次循环浏览列表,将图像添加到
TImageList
,然后最后循环浏览列表,释放图像。

我看到,您可以将TImageList设置为遇到的最大大小,然后将超出单个图像纵横比的像素设置为透明背景色。但对于这一点,我仍然需要知道遇到的最大尺寸。每一次都会有所不同。你可以链接到前面的问题,以供将来参考,并在这里询问后续问题。雷米提出了一个解决方案的想法;我来解释这个问题。如果在开始添加图像后更改imagelist的大小,imagelist将被清除,因此无法更改大小。因此,添加不同大小的图像会引发异常,因为图像列表在内部实现为单个宽图像(第一个图像的宽度乘以图像计数)。很明显,如果图像尺寸不合适,则此操作失败。+1。当然,如果你想把所有东西缩小到最小,这是可行的。但是,如果要使用最大的,可以创建一个相同大小的空图像,并用透明颜色填充它,然后将较小的图像复制到正确的位置。(我知道有人问了一个关于最小的问题——我只是想在有人问之前把这个贴出来以备将来参考。)这样做和这样做有什么区别。使用第一个jpg图像设置imagelist的宽度。然后在创建bmpOut时。将该宽度设置为imagelist宽度/高度的宽度/高度?我会更新一下我现在做了什么?第一个jpg图像可能不是最小的,因此在您首先检查所有其他图像之前,您无法将ImageList维度设置为该大小。