小标
2018-08-14
来源 :
阅读 4232
评论 0
摘要:本文主要向大家介绍了C#编程图像处理的相关讲解,获取BMP位图的方式,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。
本文主要向大家介绍了C#编程图像处理的相关讲解,获取BMP位图的方式,通过具体的内容向大家展示,希望对大家学习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
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!
喜欢 | 3
不喜欢 | 1
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号