学习图片缩略图的一点心得
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;
}*/
如果是少量图片放在内存中程序读取比较快,如果是非常多的图片感觉放在文件里比较快,
将图片信息存放在一个包含图片相关信息的泛型中速度挺快
将图片缩略目前了解两种:
(一)第一种:调用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;
}*/
如果是少量图片放在内存中程序读取比较快,如果是非常多的图片感觉放在文件里比较快,
将图片信息存放在一个包含图片相关信息的泛型中速度挺快
相关文章推荐
- 学习jacob的一点心得
- 编程开发的一点学习心得
- Android图片压缩的一点心得
- Nginx学习笔记--Nginx图片缩略图,水印处理模块
- 腾讯前端框架学习一点心得
- 关于多态的一点学习心得
- 学习js的一点心得——js对table的修饰
- 关于图片压缩的一点方法和心得
- 如何学习机器学习的一点心得
- c#学习(2):大图片的特效处理与获取屏幕上任一点的rgb值
- elasticSearch学习的一点心得
- AChartEngine的一点学习心得
- 通过AngularJS实现图片上传及缩略图展示(学习)
- 学习Vim的一点心得
- 初学者学习VC++的一点心得
- mysql存储引擎的一点学习心得总结
- C#开发ArcEngine的一点学习心得 (转)
- SNMP学习的一点心得
- 偶学习技术的一点心得.
- 学习Delphi面向对象编程的一点心得