如何用C#对8位的BMP灰度图进行处理?
如题,我知道对24位真彩色的图像进行处理是用Pixel.R(或者Pixel.G/Pixel.B)和GetPixel(x,y);但是对8位的BMP灰度图该用C#里面的什么函...
如题,我知道对24位真彩色的图像进行处理是用Pixel.R(或者Pixel.G/Pixel.B)和GetPixel(x,y);
但是对8位的BMP灰度图该用C#里面的什么函数方法呢?之前只在VC里面做过图像处理,到了C#不知道该用什么函数方法了,请高人指教 展开
但是对8位的BMP灰度图该用C#里面的什么函数方法呢?之前只在VC里面做过图像处理,到了C#不知道该用什么函数方法了,请高人指教 展开
展开全部
/// <summary>
/// 灰度
/// </summary>
/// <param name="b">原始图</param>
/// <param name="mode">模式(true:加权模式, false:平均模式)</param>
/// <returns></weightingMode>
public static Bitmap ToGray(Bitmap b, bool weightingMode)
{
if (b == null) return null;
try
{
int width = b.Width;
int height = b.Height;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * 3;
byte gray = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (weightingMode) // 加权平均
{
gray = (byte)((float)p[0] * 0.114f + (float)p[1] * 0.587f + (float)p[2] * 0.299f);
}
else // 算数平均
{
gray = (byte)((float)(p[0] + p[1] + p[2]) / 3.0f);
}
p[0] = (byte)gray;
p[1] = (byte)gray;
p[2] = (byte)gray;
p += 3;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
}
catch
{
return null;
}
}
这里用指针直接操作内存,编译时需要选中“允许不安全代码”,但这样做的运行速度要快得多。另外参数“模式”中“加权模式”是根据人眼对不同颜色的敏感程度,乘以不同的权重系数后再取平均值,而平均模式就是简单取三原色的平均值,两者的显示效果没有太大的区别。这个函数是我以前在网上找来的,稍微改了一点点,不过不记得出自哪了...
/// 灰度
/// </summary>
/// <param name="b">原始图</param>
/// <param name="mode">模式(true:加权模式, false:平均模式)</param>
/// <returns></weightingMode>
public static Bitmap ToGray(Bitmap b, bool weightingMode)
{
if (b == null) return null;
try
{
int width = b.Width;
int height = b.Height;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * 3;
byte gray = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (weightingMode) // 加权平均
{
gray = (byte)((float)p[0] * 0.114f + (float)p[1] * 0.587f + (float)p[2] * 0.299f);
}
else // 算数平均
{
gray = (byte)((float)(p[0] + p[1] + p[2]) / 3.0f);
}
p[0] = (byte)gray;
p[1] = (byte)gray;
p[2] = (byte)gray;
p += 3;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
}
catch
{
return null;
}
}
这里用指针直接操作内存,编译时需要选中“允许不安全代码”,但这样做的运行速度要快得多。另外参数“模式”中“加权模式”是根据人眼对不同颜色的敏感程度,乘以不同的权重系数后再取平均值,而平均模式就是简单取三原色的平均值,两者的显示效果没有太大的区别。这个函数是我以前在网上找来的,稍微改了一点点,不过不记得出自哪了...
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询