【#第一文档网# 导语】以下是®第一文档网的小编为您整理的《c#24位图像转8位灰度图像(数组方式)》,欢迎阅读!
![图像,灰度,数组,方式,24](/static/wddqxz/img/rand/big_124.jpg)
c#24位图像转8位灰度图像(数组方式)
现在网上的例子多数都是24位图像转24位灰度图的,即使有转8位灰度的,也是通过GetPixel(转换速度太慢)或者指针方式(一来C#并不推荐这种模式,二来我也没有学过c++之类的对指针实在不熟悉)来实现的,而没有c#推荐的数组方式的.
因为bmp在内存中储存的时候,每行都是必须是4的倍数才可以,开始忘记处理这个间隙,结果导致有的图片可以正常转换,有的图片就发生图像扭曲.
处理完这个后,又发现输出的都是一些带颜色的色点组成的图像,不是灰度图,经过查资料才知道输出的是伪彩色,要转成灰度才可以.
全部代码如下 ///
/// 灰度处理(BitmapData类) ///
/// 输出8位灰度图片 public static Bitmap 灰度处理(Bitmap 图像) {
Bitmap bmp = new Bitmap(
//设定实例BitmapData相关信息
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData data = 24bppRgb);
//锁定bmp到系统内存中
BitmapData data2 = bmp.LockBits(rect, ImageLockMode.Re
图
像.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format
图
像
.Width,
图
像.Height, PixelFormat.Format8bppIndexed);
adWrite, PixelFormat.Format8bppIndexed);
//获取位图中第一个像素数据的地址 IntPtr ptr = data.Scan0; IntPtr ptr2 = data2.Scan0;
int numBytes = data.Stride * data.Height; int numBytes2 = data2.Stride * data2.Height;
int n2 = data2.Stride - bmp.Width; //// 显示宽度与扫描线宽度的间隙
byte[] rgbValues = new byte[numBytes]; byte[] rgbValues2 = new byte[numBytes2]; //将bmp数据Copy到申明的数组中 Marshal.Copy(ptr, rgbValues, 0, numBytes); Marshal.Copy(ptr2, rgbValues2, 0, numBytes2); int n = 0;
for (int y = 0; y < bmp.Height; y++) {
for (int x = 0; x < bmp.Width * 3; x += 3) {
int i = data.Stride * y + x;
double value = rgbValues[i + 2] * 0.299 + rgbValues[i + 1] * 0.587 + rgbValues[i] * 0.114; //计算灰度
rgbValues2[n] = (byte)value; n++; }
n += n2; //跳过差值 }
//将数据Copy到内存指针
Marshal.Copy(rgbValues, 0, ptr, numBytes);
本文来源:https://www.dy1993.cn/nIDK.html