您的位置:首页 > 其它

学习图片缩略图的一点心得

2012-04-03 23:53 190 查看
最近在做一个关于图片的微程序,记录一下最近的感受。

将图片缩略目前了解两种:

(一)第一种:调用image的GetThumbnailImage(int width, int height, Image.GetThumbnailImageAbort callback, IntPtr.Zero)方法

参数 width: 缩略图的宽度

Height:缩略图的高度

Callback:image.GetThumbnailImageAbort 类型的委托,该委托必须被引用,并且该委托类型的返回值为布尔型。Image.GetThumbnailImageAbort的语法为 public delegate void bool GetThumbnailImageAbort():

Intptr.Zero:

第二种:将图片画出来并保存在指定的文件夹里画的时候可以将原图片的宽高按比例缩放也可以自己指定缩放后图片的宽和高

(1)将图片的宽高按比例缩放:

//将图片按原比例缩小显示在窗体上(窗体的paint事件中的代码)

Graphics gra = e.Graphics;

ImageList imglist = new ImageList();

float w = 10;

float h = 10;

foreach (FileInfo s in Dir.GetFiles("*.jpg", SearchOption.AllDirectories))

{

Image img = Image.FromFile(s.FullName);

float mf =(float )60 / (float )img.Width;//60为缩小后图片的宽度也可以用一个已赋值的变量来代表缩放后的图片的宽度,同理也可以根据高度缩放前后的比值来确定缩放后的宽度

RectangleF rec = new RectangleF(w, h, 50f, mf * img.Height);

gra.DrawImage(img, rec);

img.Save(“pictures”+”\\”+s.Name);//将图片保存在文件夹里

img.Dispose();

//将图片释放掉,否则会引发进程使用的异常

if(this .Width - w <=100)

{

w = 10;

h+=150;

}

else

{

w += 80;

}

}

此代码的缺陷是当 运行时的窗口拖动变大时窗体的边缘会增加重复的图片,应该是下一行的图片往上一行补的,但却变成了下一行挨着的图片重复绘图,可以考虑当窗体变大时进行重绘

(二)将很多图片显示在窗体上

如果要将缩略的图片显示在窗体上,可以将缩略过的图片画到窗体上,画完图片最好将画图设备给释放掉。在窗体的绘图事件中添加有关绘图的操作

也可以将这些图片放进imagelist中,然后再将imagelist与listview关联让图片显示在listview中

/* imageList1.ImageSize = new Size(80,100);

imageList1.Images.Clear();

listView1.Items.Clear();

FileInfo[] fileList = directory2.GetFiles("*.jpg", SearchOption.TopDirectoryOnly);

foreach (FileInfo s in fileList)

{

File.Delete(s.FullName);

}//删除以前要查找的字目的图片的缩略图(保存在文件夹Pic2)中

string ErrorMessage;

int i = 0;

try

{

foreach (FileInfo s in Dir.GetFiles("*.jpg", SearchOption.TopDirectoryOnly))//生成选中字目的图片的缩略图并保存在Pic2文件夹下

{

Image ResourceImage;

Image ReducedImage;

ResourceImage = Image.FromFile(s.FullName);

Image.GetThumbnailImageAbort callback = new Image.GetThumbnailImageAbort(ThumbnailCallback);

ReducedImage = ResourceImage.GetThumbnailImage(80, 100, callback, IntPtr.Zero);

ReducedImage.Save("Pic2" + "\\" + s.Name, ImageFormat.Jpeg);

imageList1.Images.Add(ReducedImage);

listView1.Items.Add(s.Name, i);

i++;

ResourceImage.Dispose();//必须释放.否则会引发有关进程冲突的异常

ReducedImage.Dispose();

//imageList1.Images.Add(ResourceImage);

//listView1.Items.Add(s.Name, i++); ResourceImage.Dispose();//必须释放.否则会引发有关进程冲突的异常

}

}

catch (Exception m)

{

ErrorMessage = m.Message;

}*/

如果是少量图片放在内存中程序读取比较快,如果是非常多的图片感觉放在文件里比较快,

将图片信息存放在一个包含图片相关信息的泛型中速度挺快
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: