标签:6.19 C# curBitmap bytes System bmpData Stride 灰度 rgbValues
6.19 C#图像灰度化案例 优化
结果:
结论:内存法最佳
private void Memory_Click(object sender, EventArgs e)
{
if (curBitmap != null)
{
myTimer.ClearTimer();
myTimer.Start();
Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);//新建矩形绘板
System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = curBitmap.Width * curBitmap.Height * 3;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes); //将intPtr变量ptr(非托管对象)复制到一维的字节数组rgbValues(托管对象)中
double colorTemp = 0;
for (int i = 0; i < rgbValues.Length; i += 3)
{
colorTemp = rgbValues[i + 2] * 0.299 + rgbValues[i + 1] * 0.587 + rgbValues[i] * 0.114;
rgbValues[i] = rgbValues[i + 1] = rgbValues[i + 2] = (byte)colorTemp;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);//将一维的字节数组rgbValues(托管对象)复制到intPtr变量ptr(非托管对象)中
curBitmap.UnlockBits(bmpData);
myTimer.Stop();
textBox1.Text = myTimer.Duration.ToString("####.##") + "毫秒";
Invalidate();
}
}
如果是任意大小的24位彩色图像,则上述程序就不再适用,
需要修改,修改后的代码如下:
private void memory_Click(object sender^ EventArgs e)
(
if (curBitmap != null)
{
//位图矩形
Rectangle rect = new Rectangle (0, 0, curBitmap^Width, curBitmap.Height);
//以可读写的方式锁定全部位图像素
System.Drawing»Imaging *BitmapData bmpData - curBitmap* LockBits(rect, System.Drawing ,Imaging.ImageLockMode- ReadWriteF curBitmap,PixelFormat};
〃很到首地址
IntPtr ptr = bmpData^ScanO;
//定义被锁定的数组大小,由位图数据与未用空间组成
int bytes 宜 bmpData.Stride ♦ bmpData.Height;
byte[] rgbValues = new byte[bytes];
//复制被锁定的位图像素值到该教组内
Systern.Runtime.InteropServices.Marshal.Copy(ptrf rgbValues, 0z bytes);
〃灰度化
double colorTemp = 0;
for (int i = 0; i < bmpData.Height; i++)
{
//只处理每行中是图像像素的数据,舍弃未用空间
for (int j » 0; j < bmpData.Width * 3; j += 3)
{
colorTemp = rgbValues(i * bmpData.Stride + j + 2] * 0.299 + rgbValues[i * bmpData.Stride + j + 1] • 0.587 + rgbValues[i * bmpData-Stride + j] * 0.114;
rgbValues[i * bmpData*Stride + j] = rgbValues[i * brnpData.Stride + j + 1] rgbValues fi * bmpData.Stride + j + 2] « (byte)colorTemp;
//把数组复制回位图
System.Runtime.InteropServices.Marshal•Copy(rgbValues# 0r ptrz bytes); //解锁位图像素
curBitmapeUnlockBit3(bmpData);
〃对窗体进行重新籍制,这将强制执行Paint事件处理程序
InvalidateO/
标签:6.19,C#,curBitmap,bytes,System,bmpData,Stride,灰度,rgbValues
来源: https://blog.csdn.net/weixin_41938739/article/details/118075169
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。