C#图像处理相关

今天编写图像处理上位机的时候看到较好的程序,贴在这里解析和学习一下。
首先就是获取BMP位图的方式。
OpenFileDialog openFileDialog = new OpenFileDialog();
//假设用户在搜索文件的过程中更改了目录,那么,如果对话框会将当前目录还原为初始值,则值为 true;反之,值为 false。 默认值为 false。也就是记忆上次选中的文件夹
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
Bitmap Temp = (Bitmap)Bitmap.FromFile(openFileDialog.FileName);//把任何格式的图片转化为BMP图像
if (IsGrayBitmap(Temp) == true) //判断图像是否为灰度图像
SrcBmp = Temp;
else
{
SrcBmp = ConvertToGrayBitmap(Temp);//将彩色图片转化为灰度图片
Temp.Dispose(); //释放图像所占用的资源
}
/****************************判读是否灰度图像*******************************/
private bool IsGrayBitmap(Bitmap Bmp)
{
if (Bmp.PixelFormat != PixelFormat.Format8bppIndexed) //首先判断像素点是不是8位255深度的
{
return false;
}
if (Bmp.Palette.Entries.Length != 256) //
{
return false;
}
for (int Y = 0; Y < Bmp.Palette.Entries.Length; Y++)
{
if (Bmp.Palette.Entries[Y] != Color.FromArgb(255, Y, Y, Y))
{
return false;
}
}
return true;
}
/****************************创建一个灰度图像******************************/
private Bitmap CreateGrayBitmap(int Width, int Height)
{
//创建8位深度的灰度图像
Bitmap Bmp = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed);
ColorPalette Pal = Bmp.Palette;
for (int Y = 0; Y < Pal.Entries.Length; Y++)
{
Pal.Entries[Y] = Color.FromArgb(255, Y, Y, Y);//将RGB转化为灰度调色板
}
Bmp.Palette = Pal;
return Bmp;
}
/****************************创建一个灰度图像******************************/
private Bitmap ConvertToGrayBitmap(Bitmap Src)
{
Bitmap Dest = CreateGrayBitmap(Src.Width, Src.Height);
BitmapData SrcData = Src.LockBits(new Rectangle(0, 0, Src.Width, Src.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);//这个我还没搞懂具体的作用
BitmapData DestData = Dest.LockBits(new Rectangle(0, 0, Dest.Width, Dest.Height), ImageLockMode.ReadWrite, Dest.PixelFormat);
int Width = SrcData.Width, Height = SrcData.Height;
int SrcStride = SrcData.Stride, DestStride = DestData.Stride;
byte* SrcP, DestP;//c#使用指针的时候必须开启unsafe功能,下面有开启unsafe功能的方法
for (int Y = 0; Y < Height; Y++)
{
SrcP = (byte*)SrcData.Scan0 + Y * SrcStride; // 必须在某个地方开启unsafe功能,其实C#中的unsafe很safe,搞的好吓人。
DestP = (byte*)DestData.Scan0 + Y * DestStride;
for (int X = 0; X < Width; X++)
{
DestP = (byte)((*SrcP + ((SrcP + 1) << 1) + *(SrcP + 2)) >> 2);//将彩色图像转化为灰度图像的变换公式
SrcP += 3;
DestP++;
}
}
Src.UnlockBits(SrcData);
Dest.UnlockBits(DestData);//解锁
return Dest;
}
勾选圈着的地方
然后在类的声明的时候需要声明为unsafe类型的
public unsafe partial class Form1 : Form

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值