2012-06-12 17 views
0

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

下面的代码是图像的加载 - >转换为bmp - >增加了图像列表

后约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; 
+0

我看到过你可以将TImageList设置为遇到的最大尺寸,然后将各个图像宽高比之外的像素设置为透明背景颜色。但为此我仍然需要知道遇到的最大尺寸。其中每次都会有所不同 –

+0

您可能刚刚链接到上一个问题,以供将来参考,并在此处询问后续问题。雷米提出了一个解决方案的想法;我会解释这个问题。如果您在开始添加图像后更改图像列表的大小,图像列表将被清除,因此您无法更改大小。因此添加不同大小的图像会引发异常,因为图像列表在内部是作为单个宽图像(第一个图像的宽度乘以图像计数)实现的。然后,这会失败,并显示一张非常大的图片。 –

回答

1

一旦你开始将图像导入TImageList,你不能调整其大小,所有图片必须是相同的大小。因此,您必须提前预加载所有图像,然后才能确定可用的最小尺寸,然后裁剪/将任何较大图像拉伸至较小尺寸,然后您可以将最终图像加载到TImageList中。

有你的循环店内所有TJPEGImage成一个TListTObjectList,并不能释放他们马上,那么你就可以通过该列表计算最小的尺寸,然后在列表中根据需要再次调整图像循环回路,然后循环通过列表再次将图像添加到TImageList,然后最终循环播放列表以释放图像。

+1

+1。当然,如果你想把所有的东西都缩小到最小,那么这是有效的。但是,如果您想使用最大的图像,则可以使用透明颜色创建一个大小相同的空图像和FloodFill,然后将较小的图像复制到正确的位置。 (我知道这个问题是关于最小的问题 - 只是想在有人问之前发布这个以供将来参考。) –

+0

这样做和它有什么区别。用第一张jpg图像设置图像列表的宽度。然后创建bmpOut。将该宽度设置为imagelist宽度/高度的宽度/高度?虐待更新与我现在做什么的答案? –

+0

第一张jpg图像可能不是最小的,所以在第一次检查所有其他图像之前,您将无法将ImageList尺寸设置为该尺寸。 –