本文主要是介绍17.3.2.8 自定义处理(内存处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
自定义处理的算法请参看第17.3.1.6节。17.3.1.6 自定义处理-CSDN博客
【例 17.50】自定义图像处理,保留图像上的单一色系或者多个色系。
//自定义图像处理private void btnCustom_Click(object sender, EventArgs e){Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);BitmapData sourceData = sourceImg.LockBits(new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);BitmapData destData = destImg.LockBits(new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);IntPtr pSource = sourceData.Scan0;int allBytes = sourceData.Stride * sourceData.Height;byte[] rgbvalues = new byte[allBytes];Marshal.Copy(pSource, rgbvalues, 0, allBytes);int pos = 0;int R, G, B;int avgValue;for (int j = 0; j < sourceData.Height; j++){for (int i = 0; i < sourceData.Width; i++){B = rgbvalues[pos];G = rgbvalues[pos + 1];R = rgbvalues[pos + 2];Color newColor;//根据选择情况,保留选定的色系,其它颜色处理成灰度switch (getSingleColor(R, G, B)){case "R":if( cbR.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B); break;case "G":if( CBG.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B);break;case "B":if (cbB.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B);break;case "P":if (cbP.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B);break;case "Y":if (cbY.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B);break;case "A":if (cbA.Checked == true)newColor = Color.FromArgb(R, G, B);elsenewColor = getAverage(R, G, B);break;default:newColor = getAverage(R, G, B);break;}rgbvalues[pos] = newColor.B;rgbvalues[pos + 1] = newColor.G;rgbvalues[pos + 2] = newColor.R;pos = pos + 3;}pos = pos + sourceData.Stride - sourceData.Width * 3;}IntPtr pDest = destData.Scan0;Marshal.Copy(rgbvalues, 0, pDest, allBytes);sourceImg.UnlockBits(sourceData);destImg.UnlockBits(destData);picDest.Image = destImg;}//计算所属色系,并返回色系缩写字母private string getSingleColor(int R, int G, int B){if ((R > 128) && (R - G > 30) && (R - B > 30))return "R";if ((G > 80) && (G - R > 5) && ((G - B > 20) | (B - G) < 10))return "G";if ((B > 80) && (B - R > 50) && (B - G > 30))return "B";if ((R > 128) && (B > 128) && (R - G > 30) && (B - G > 30))return "P";if ((R > 140) && (G > 120) && (Math.Abs(G - R) < 40) && (R - B > 80) && (G - B > 80))return "Y";if ((G > 180) && (B > 180) && ((B >= G) | (G - B) < 10) && (B - R > 40) && (G - R > 40))return "A";return "N";}//计算灰度均值,返回灰度颜色private Color getAverage(int R , int G, int B ){int gray;gray = (R + G + B) / 3;Color newColor = Color.FromArgb(gray, gray, gray);return newColor;}
学习更多vb.net知识,请参看vb.net 教程 目录
学习更多C#知识,请参看 C# 教程 目录
这篇关于17.3.2.8 自定义处理(内存处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!