zoukankan      html  css  js  c++  java
  • LISTVIEW显示JPEG缩略图

    http://www.ctsys.cn/files/SHOW_FILES.ASPX?ID=22

    许多的JPEG图片浏览器(如由我设计的《JPEG浏览缩放器》),都可以将JPEG缩略图放置到Listview控件中,实现图片的预览。要在Listview上显示图片,Listview控件必须与Imagelist控件关联,先将图片装入到IMAGELIST控件中,再通过这种方式对应:

    Listview1.Item[0].ImageIndex=3

    但是Imagelist控件仅支持BMP和ICO格式,而且装载进去的图片,必须强制转换成一个预定的大小,如32*32等,对于JPEG格式的图片来说,是不支持的,而通过重载Imagelist控件,使它支持JPEG格式,难度也比较大,所以最后我采用了这种方法:

    (1)                在FROM1上放置一个Image控件,一个Imagelist控件,一个Listview控件。

    (2)                将Listview1控件与Imagelist1控件关联。Listview1的LargeImages=ImageList1,Listview1.ViewStyle=vsIcon., Imagelist1的Height和Width都设为120,因为JPEG缩略图的大小通常是120*120的,对于不是这个比例的图片,JPEG缩略图会按比例调节。

    (3)                使用GDI+的功能,将JPEG缩略图绘制在Image1控件里,这样做之后,Image1里的图片相当于BMP格式的了,即将JPEG缩略图转换成BMP的小图片。

    绘制JPEG缩略图代码如下:

    //----------------------------------------------------------------------------------

    Uese GDIPUTIL,GDIPAPI,GDIPOBJ; //GDI+的DELPHI封装API

    const MAX=120; //缩略图的最大值

    procedure TForm1.showjpg(fnames:string);

    VAR Graphics : TGPGraphics;

        Image, Thumbnail: TGPImage;

        SZ:double;

        p:tgppen;

        i:single; //JPEG缩略图的宽高比

        W,H:integer; //计算JPEG缩略图的宽与高度

    begin

    TRY

       image1.Picture :=nil;  

       Image:=TGPImage.Create(fnames);

    //计算图片宽度和高度,大的=MAX(即120),另一个按比例调整

       if Image.GetWidth >Image.GetHeight then

            begin

               W:=MAX;

               i:=Image.GetWidth /W;

               i:=Image.getHeight /i;

               H:=ROUND(I);

            end

            ELSE

            BEGIN

              H:=MAX;

              I:=Image.getHeight /H;

              i:=Image.getWidth /i;

              W:=ROUND(I);

            END;

       //先绘制一个120*120的白色矩形

        p:=tgppen.Create(0,2);

        p.SetColor(makecolor(200,200,200));

        //-----取JPEG缩略图,绘制到Image1中-------

       Thumbnail := image.GetThumbnailImage(W, H,   nil,   nil);

       Graphics :=TGPGraphics.Create(image1.Canvas.Handle);

       image1.Canvas.Lock ;

       graphics.Clear(makecolor(255,255,255));

       Graphics.DrawImage(Thumbnail, (120-w) div 2,

                                        (120-h)   div2,Thumbnail.GetWidth,

                                        Thumbnail.GetHeight);

    //给这个图片加个边框

       graphics.DrawRectangle(p,makerect(0,0,120,120));

       image1.Canvas.Unlock ;

     Image.Free;

     Thumbnail.Free;

     p.Free;

     Graphics.Free;

    except;

     Image.Free;

     Thumbnail.Free;

       p.Free;

     Graphics.Free;

    END;

    end;

              //-------------------------------------------------------------------------------------

    (4) 将Image1的图片添加到ImageList控件中。

        Imagelist1.add(Image1.Picture.Bitmap ,NIL);

    这个时候,就可以在Listview1中使用JPEG图片了,通过这种方式,你还可以添加更多JPEG图片进来。

    这个程序是思路是将JPEG缩略图绘制到Image1中,使之在内存中以BMP格式存在,Imagelist控件再将这个内存中的BMP装载进来,供与之关联的Listview控件使用

    有些朋友会说Image可以直接载入并显示JPEG图片,那先通过Image载入JPEG图片,再通过Imagelist控件调用不是可以吗,其实是行不通的,Image直接装载的JPEG图片,不是以BMP格式存在的,无法在Imagelist中使用。当然也可以先用Image装载JPEG图片,再通过拷屏的方式取得缩略图,但以这种方式装载的图片,是将整个JPEG图片装进来的,所需的花销很大,无法实现大批量快速装载。

    在以上的代码中,使用到了GDI+ API的功能,由于DELPHI 7中不包含GDI+ API的封装,你需要另行下载GDI+的封装函数包(本网站提供了这个封装包,你可以到《电子文档》那里下载 GdiPlus.rar)。

  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/yzryc/p/6401832.html
Copyright © 2011-2022 走看看