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)。

LISTVIEW显示JPEG缩略图的更多相关文章

  1. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  2. Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

    Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIB ...

  3. ecshop订单打印页显示商品缩略图和序号

    ecshop订单打印页显示商品缩略图和序号 订单打印页显示商品缩略图,在论坛没找到适合2.7.2相关的文章,特意贴上来给大家研究一下.1.找到 $sql = "SELECT o.*, IF( ...

  4. 转 wince程序 中使用Listview显示图标问题 (C#) .

    思路: 1.窗体控件:lstaqgl [Listview控件名称]  imageList1[ImageList控件] 2.  图片路径添加到—imageList1——Listview显示图片从 ima ...

  5. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  6. Android在ListView显示图片(重复混乱闪烁问题)

    Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...

  7. ScrollView嵌套ListView显示不完全、嵌套TextView不能滚动解决办法

    目录: 一.情景说明 二.最初做法 三.解决办法 一.情景说明 1.情景       最近项目刚好有一个需求,需要在一个界面中用ScrollView嵌套一个滚动的TextView和一个listView ...

  8. android listView多层嵌套listView显示不全问题

    最近在做项目,需要用到listVIew多层嵌套listVIew的需求,先发现已下两个处理办法比较好用 第一种: public class ListViewNesting extends ListVie ...

  9. 解决ScrollView中包含ListView,导致ListView显示不全

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

随机推荐

  1. 矩阵半正定: positive semidefinite

    具体定义:https://en.wikipedia.org/wiki/Positive-definite_matrix

  2. linux驱动开发—基于Device tree机制的驱动编写

    前言Device Tree是一种用来描述硬件的数据结构,类似板级描述语言,起源于OpenFirmware(OF).在目前广泛使用的Linux kernel 2.6.x版本中,对于不同平台.不同硬件,往 ...

  3. Javascript-关于null、undefined、空字符串的区分

    一.分别判断 var a=null; //var a=undefined; //var a=''; //var a='DD'; if(!a&&typeof a == 'object') ...

  4. .NET Core和.NET Standard

    作为.NET家族的最新成员,有很多关于.NET Core和.NET Standard的误解,以及它们于.NET Framework之间的区别.在这篇文章,我会准确的解释他们究竟是什么,并看看何时应选择 ...

  5. DIV左、右布局

    1.右边宽度固定,左边自适应 第一种(flex布局,不兼容IE9以下浏览器): <style> body { display: flex; } .left { background-col ...

  6. Django之Models进阶操作(字段属性)

    字段属性详细介绍 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列, ...

  7. lunix 项目部署 *****

    linux基本管理命令 服务器上安装服务,python3.6(宿主机上的物理解释器)1.虚拟解释器virtualenv虚拟出多个干净.隔离的python解释器环境问题:管理上较为麻烦,需要找到venv ...

  8. jmeter造当前时间,未来时间,历史时间

    需求: 需要测试POST接口参数中的time,且需要造时间戳 1.当前系统时间获取 函数:__time 应用: ${__time(yyyy-MM-dd HH:mm:ss,)} ${__time(yyy ...

  9. c# Color 颜色设置

    #region 笔刷颜色 public SolidColorBrush col(byte a, byte r, byte g, byte b) { #region 颜色说明 //Color.FromA ...

  10. LeetCode 4. Median of Two Sorted Arrays & 归并排序

    Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...