博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LISTVIEW显示JPEG缩略图
阅读量:4360 次
发布时间:2019-06-07

本文共 2520 字,大约阅读时间需要 8 分钟。

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

Listview1.Item[0].ImageIndex=3

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

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

(2)                Listview1控件与Imagelist1控件关联。Listview1LargeImages=ImageList1Listview1.ViewStyle=vsIcon., Imagelist1HeightWidth都设为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)

 

转载于:https://www.cnblogs.com/hssbsw/archive/2012/06/03/2533095.html

你可能感兴趣的文章
knockoutJS学习笔记04:监控属性
查看>>
Linux下启动/关闭Oracle
查看>>
session和cookie的区别
查看>>
alert弹出窗口,点击确认后关闭页面
查看>>
oracle问题之数据库恢复(三)
查看>>
单点登陆(SSO)
查看>>
HR,也确实“尽职尽责”
查看>>
MaxComputer 使用客户端配置
查看>>
20190823 顺其自然
查看>>
阅读《余生有你,人间值得》有感
查看>>
每日英语
查看>>
SpringCloud+feign 基于Springboot2.0 负载均衡
查看>>
【BZOJ5094】硬盘检测 概率
查看>>
大庆金桥帆软报表案例
查看>>
Proxy模式
查看>>
读书多些会怎样
查看>>
浏览器好用的技术
查看>>
HDU 2188------巴什博弈
查看>>
tp5任务队列使用supervisor常驻进程
查看>>
Xmind?
查看>>