我在论坛里找了,没找到,有旧帖子,但是看不了,无法显示。
我想做个看图的软件,练习一下。用了Listview控件,它的Largimage是imagelist2,但是imagelist是只支持bmp和ico图片的,因此要显示jpg图片的缩略图我就需要将jpg图片转化为bmp图片,并且按原图尺寸的比例缩小到30*30以下,因为imagelist的大小就是30*30。目前我已经将jpg图片转换为了bmp图片,并且可以显示出来了,但是由于没有经过尺寸处理,只能显示30*30的部分,其他部分就看不到,而且显示的非常慢,因此需要把图片缩小,请问怎么做?谢谢大家啊~~~~

解决方案 »

  1.   

    bmp<-->jpg    
      可以如下,(其他格式也许也可,试一下)记得加入 use jpeg. 
    varMyJpeg: TJpegImage;Image1: TImage;beginImage1:= TImage.Create(self);MyJpeg:= TJpegImage.Create;Image1.Picture.Bitmap.LoadFromFile('c:.BMP'); // Load the Bitmap from a fileMyJpeg.Assign(Image1.Picture.Bitmap); // Assign the BitMap to MyJpeg objectMyJpeg.CompressionQuality:=StrToInt('75');MyJpeg.Compress;MyJpeg.SaveToFile('c:.JPG'); // Save the JPEG to Diskend;varMyJpeg: TJpegImage;bmp: Tbitmap;beginbmp:=tbitmap.Create;MyJpeg:= TJpegImage.Create;myjpeg.LoadFromFile('c:.jpg');bmp.Assign(myjpeg);bmp.SaveToFile('c:.bmp'); // Save the JPEG to Diskend;**************************************************************************///Bitmap 和 JPEG 格式间的快速转换function Bmp2Jpg(Bmp: TBitmap; Quality: Integer = 100): TJpegImage;beginResult := nil;if Assigned(Bmp)then beginResult := TJpegImage.Create;Result.Assign(Bmp); {It′s all folks...}Result.CompressionQuality := Quality;Result.JPEGNeeded; {Key method...}Result.Compress;end;end;function Jpg2Bmp(Jpg: TJpegImage): TBitmap;beginResult := nil;if Assigned(Jpg)then beginResult := TBitmap.Create;Jpg.DIBNeeded; {Key method...}Result.Assign(Jpg); {It′s all folks...}end;end; 
     
      

  2.   

    通过下面的方法:Canvas.StretchDraw(TRect,TGraphic)例如:缩小为原来的 Width/2, Height/2;var 
      bitmap: TBitmap;
      Jpg: TJpegImage;
      rect: TRect;
    begin
      ...
      rect.left:=0;
      rect.top:=0;
      rect.right:=Jpg.Width/2;
      rect.bottom:=Jpg.Height/2;  bitmap.Canvas.StretchDraw(rect,Jpg);
      ...
    end;
      

  3.   

    rect.right:=JpgFile.Width/2;
    rect.bottom:=JpgFile.Height/2;这里有错误啊,Incompatible types: 'Integer' and 'Extended'
      

  4.   

    运行的时候会提示“ivalid image size”
         if (AnsiLowerCase(ExtractFileExt(SearchRec.Name))='.jpg') then
         begin
           ListView1.Items.BeginUpdate;
           try
               JpgFile.LoadFromFile(Folder+SearchRec.Name);           rect.left:=0;
               rect.top:=0;
               rect.right:=JpgFile.Width/2
               rect.bottom:=JpgFile.Height/2;
    ;//上面两行会出现Incompatible types: 'Integer' and 'Extended'的错误,           BitFile.Canvas.StretchDraw(rect,JpgFile);
               ImageList2.Add(BitFile,nil);           ListItem:=ListView1.Items.Add;   //就是这里提示出错,ivalid image size
               ListItem.Caption:=SearchRec.Name;
               ListItem.ImageIndex:=imagelist2.Count-1;
            finally
              ListView1.Items.EndUpdate;
              BitFile.FreeImage;
            end;
         end;
      

  5.   

    我知道了ivalid image size 的错误了,要加一句 BitFile.Assign(JpgFile);
    但是第一个错误咋办呢?
      

  6.   

    源代码是从BCB 中翻译过来的(经过测试):例如:缩小为原来的 Width/2, Height/2;var 
      bitmap: TBitmap;
      Jpg: TJpegImage;
      rect: TRect;
    begin
      ...
      rect.left:=0;
      rect.top:=0;
      rect.right:=Jpg.Width div 2;
      rect.bottom:=Jpg.Height div 2;  bitmap.Width:=Jpg.Width div 2;
      bitmap.Height:=Jpg.Height div 2;  bitmap.Canvas.StretchDraw(rect,Jpg);
      ...
    end;
      

  7.   

    多谢,问题解决了,但是有个新问题,Listview的Item不会擦除已经显示过的图片,而是在之上再显示新图片, 这样就重叠显示了,越积越多,应该是最后显示的Item里的图片把前面所有的都包括了,最上面的才是它本身该显示的。
    这前面是查找语句,循环把jpg图片插到imagelist2中的。
         if (AnsiLowerCase(ExtractFileExt(SearchRec.Name))='.jpg') then
         begin
           ListView1.Items.BeginUpdate;
           try
               JpgFile.LoadFromFile(Folder+SearchRec.Name);
               rect.left:=0;
               rect.top:=0;
               h:=JpgFile.Height * 80 div JpgFile.Width;
               w:=JpgFile.Width * 80 div JpgFile.Height;
               if JpgFile.Width>JpgFile.Height then
               begin
                 rect.right:=80;
                 rect.bottom:=h;
               end
               else if JpgFile.Height>JpgFile.Width then
               begin
                 rect.right:=w;
                 rect.Bottom:=80;
               end;
                  BitFile.Width:=80;
                  BitFile.Height:=80;
               BitFile.Canvas.StretchDraw(rect,JpgFile);
               ImageList2.Add(BitFile,nil);
               ListItem:=ListView1.Items.Add;
               ListItem.Caption:=SearchRec.Name;
               ListItem.ImageIndex:=imagelist2.Count-1;
            finally
              ListView1.Items.EndUpdate;
              BitFile.FreeImage;
            end;
         end;
      

  8.   

    我知道了,
    在循环开始把JpgFile,BitFile create,然后在循环完成之前,也就是finally后把她们destory掉,这样能解决,对吗?
      

  9.   

    我还有个问题,怎么改变icon图标的尺寸呢?
    比如32*32的我想把它放大到48*48的,加到imagelist中。