如何转换像素格式?从Cb的32bppRGB到16bpp灰度
发布时间:2020-12-15 05:39:09 所属栏目:百科 来源:网络整理
导读:我需要为我的图像做一些阈值处理.阈值滤波器功能只接受8-16bpp灰度.我的位图图片具有32bppRGB像素格式.请为此建议一些代码. (我也想知道是否有可能没有像素操作) 附:我正在使用Aforge.NET进行阈值处理. 谢谢 -Sagar 解决方法 最简单的方法: public static
我需要为我的图像做一些阈值处理.阈值滤波器功能只接受8-16bpp灰度.我的位图图片具有32bppRGB像素格式.请为此建议一些代码. (我也想知道是否有可能没有像素操作)
附:我正在使用Aforge.NET进行阈值处理. 谢谢 -Sagar 解决方法
最简单的方法:
public static Bitmap MakeGrayscale(Bitmap original) { //make an empty bitmap the same size as original Bitmap newBitmap = new Bitmap(original.Width,original.Height); for (int i = 0; i < original.Width; i++) { for (int j = 0; j < original.Height; j++) { //get the pixel from the original image Color originalColor = original.GetPixel(i,j); //create the grayscale version of the pixel int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11)); //create the color object Color newColor = Color.FromArgb(grayScale,grayScale,grayScale); //set the new image's pixel to the grayscale version newBitmap.SetPixel(i,j,newColor); } } return newBitmap; } 更快的方式: public static Bitmap MakeGrayscale2(Bitmap original) { unsafe { //create an empty bitmap the same size as original Bitmap newBitmap = new Bitmap(original.Width,original.Height); //lock the original bitmap in memory BitmapData originalData = original.LockBits( new Rectangle(0,original.Width,original.Height),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb); //lock the new bitmap in memory BitmapData newData = newBitmap.LockBits( new Rectangle(0,ImageLockMode.WriteOnly,PixelFormat.Format24bppRgb); //set the number of bytes per pixel int pixelSize = 3; for (int y = 0; y < original.Height; y++) { //get the data from the original image byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride); //get the data from the new image byte* nRow = (byte*)newData.Scan0 + (y * newData.Stride); for (int x = 0; x < original.Width; x++) { //create the grayscale version byte grayScale = (byte)((oRow[x * pixelSize] * .11) + //B (oRow[x * pixelSize + 1] * .59) + //G (oRow[x * pixelSize + 2] * .3)); //R //set the new image's pixel to the grayscale version nRow[x * pixelSize] = grayScale; //B nRow[x * pixelSize + 1] = grayScale; //G nRow[x * pixelSize + 2] = grayScale; //R } } //unlock the bitmaps newBitmap.UnlockBits(newData); original.UnlockBits(originalData); return newBitmap; } } 最快的方式: public static Bitmap MakeGrayscale3(Bitmap original) { //create a blank bitmap the same size as original Bitmap newBitmap = new Bitmap(original.Width,original.Height); //get a graphics object from the new image Graphics g = Graphics.FromImage(newBitmap); //create the grayscale ColorMatrix ColorMatrix colorMatrix = new ColorMatrix( new float[][] { new float[] {.3f,.3f,0},new float[] {.59f,.59f,new float[] {.11f,.11f,new float[] {0,1,1} }); //create some image attributes ImageAttributes attributes = new ImageAttributes(); //set the color matrix attribute attributes.SetColorMatrix(colorMatrix); //draw the original image on the new image //using the grayscale color matrix g.DrawImage(original,new Rectangle(0,original.Height,GraphicsUnit.Pixel,attributes); //dispose the Graphics object g.Dispose(); return newBitmap; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |