版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
通过第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# 教程 目录