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)。
LISTVIEW显示JPEG缩略图的更多相关文章
- Android 自定义 ListView 显示网络上 JSON 格式歌曲列表
本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...
- Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源
Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIB ...
- ecshop订单打印页显示商品缩略图和序号
ecshop订单打印页显示商品缩略图和序号 订单打印页显示商品缩略图,在论坛没找到适合2.7.2相关的文章,特意贴上来给大家研究一下.1.找到 $sql = "SELECT o.*, IF( ...
- 转 wince程序 中使用Listview显示图标问题 (C#) .
思路: 1.窗体控件:lstaqgl [Listview控件名称] imageList1[ImageList控件] 2. 图片路径添加到—imageList1——Listview显示图片从 ima ...
- 在VC下显示JPEG、GIF格式图像的一种简便方法
在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言 JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...
- Android在ListView显示图片(重复混乱闪烁问题)
Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...
- ScrollView嵌套ListView显示不完全、嵌套TextView不能滚动解决办法
目录: 一.情景说明 二.最初做法 三.解决办法 一.情景说明 1.情景 最近项目刚好有一个需求,需要在一个界面中用ScrollView嵌套一个滚动的TextView和一个listView ...
- android listView多层嵌套listView显示不全问题
最近在做项目,需要用到listVIew多层嵌套listVIew的需求,先发现已下两个处理办法比较好用 第一种: public class ListViewNesting extends ListVie ...
- 解决ScrollView中包含ListView,导致ListView显示不全
ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...
随机推荐
- C语言:结构体,共用体
结构体: 一个变量,存储不同类型的数据项共用体:一个变量,存储不同类型的数据项,相同的内存位置,存储不同的数据类型 #include <stdio.h> #include <stri ...
- JS中 == ,===, !=, !==的区别
一个等号是赋值操作,==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. === 判断规则 如果类型不同,就[不相等] 如果两个都是数值,并且是同一个值,那么[相等]:(!例外 ...
- jieba gensim 用法
简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...
- [PHP-DI] 理解依赖注入
理解依赖注入 依赖注入 和 依赖注入容器 是不同的: 依赖注入 (Dependency injection) 是编写更好代码的一种方法 容器 (Container) 是帮助注入依赖关系的工具 你不需要 ...
- [Unity插件]Lua行为树(一):BehaviorDesigner源码分析
BehaviorDesigner是Unity上的一款行为树插件,不过这个插件是用C#编写的,编写出来的行为树也是依赖于C#的,不利于热更,所以有必要写一个lua版本的. 首先下载BehaviorDes ...
- 34.scrapy解决爬虫翻页问题
这里主要解决的问题: 1.翻页需要找到页面中加载的两个参数. '__VIEWSTATE': '{}'.format(response.meta['data']['__VIEWSTATE']), '__ ...
- 24.纯 CSS 创作出平滑的层叠海浪特效
原文地址:https://segmentfault.com/a/1190000014895634 感想:这里的波浪只是侧面的,利用几个平面一部分弧旋转得到. HTML代码: <div class ...
- 2.3在LeetCode中使用我们自定义的类
在上一节中我们使用的是java提供了的类,这一小节中我们就来学习一下如何在LeetCode中使用我们自定义的类. 其实很简单,我们只需把我们编写的自定义类,拷贝到LeetCode提供的类中,形成类中类 ...
- kvm虚拟机相关
一.虚拟机与宿主机鼠标不同步问题: https://blog.csdn.net/u012255731/article/details/53006195 先关闭虚拟机,想要修改鼠标和宿主机界面同步方法如 ...
- centos6 安装 docker 问题
参考:https://www.cnblogs.com/cs294639693/p/10164258.html 第一步:删除 参考:https://www.cnblogs.com/liuyanshen ...