版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
通过第17.3.2.1节到第17.3.2.8节,相信读者对通过锁定内存来处理图像有了一定认识。与第17.3.1节相比较,可以看到代码量增加了不少,而且跟踪字节数组中数据位置时很容易把人绕晕。因此这里有一个重要的问题:为什么需要学习复杂的内存处理?
答案就是:一切都是为了效率。
【例 17.51】【项目:code17-033】像素处理与内存处理之比较。
本例中使用灰度平均值的算法,分别计算像素处理和内存处理所耗费的时间。
Bitmap sourceImg;
private void Form1_Load(object sender, EventArgs e)
{
picSource.SizeMode = PictureBoxSizeMode.StretchImage;
picDest.SizeMode = PictureBoxSizeMode.StretchImage;
}
private void btnLoad_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "图片文件|*.jpg;*.png";
if (ofd.ShowDialog() != DialogResult.OK)
return;
sourceImg = (Bitmap)Image.FromFile(ofd.FileName);
picSource.Image = sourceImg;
System.IO.FileInfo imgfile=new System.IO.FileInfo(ofd.FileName);
lblSize.Text = imgfile.Length + "字节";
lblWidth.Text = sourceImg.Width + "像素";
lblHeight.Text = sourceImg.Height + "像素";
}
//计算像素处理所需要的时间
private void btnByPixel_Click(object sender, EventArgs e)
{
DateTime timeStart, timeEnd;
TimeSpan timeDiff;
timeStart = DateTime.Now;
//……使用【例 17.34】灰度平均值的代码
timeEnd = DateTime.Now;
timeDiff = timeEnd - timeStart;
lblByPixel.Text = timeDiff.TotalMilliseconds + "ms";
}
//计算内存处理所需要的时间
private void btnByMemory_Click(object sender, EventArgs e)
{
DateTime timeStart, timeEnd;
TimeSpan timeDiff;
timeStart = DateTime.Now;
//…… 使用【例 17.44】灰度平均值的代码
timeEnd = DateTime.Now;
timeDiff = timeEnd - timeStart;
lblByMemory.Text = timeDiff.TotalMilliseconds + "ms";
}
运行结果如下图所示:
图17-50 像素处理与内存处理耗费时间
从图17-50可以看到,在处理一张大小为3024*4032的图片时,同样的算法,像素处理耗费的时间是内存处理时间的百倍。
总之,效率是第一生产力,在处理图像时可以先使用像素处理辅助理解算法,但在正式代码中应使用内存处理。
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看 C# 教程 目录