using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
namespace test {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
GetScreenCapture(); //屏幕截图
ImgRgbToGray(new Bitmap(@"G:\新建文件夹\abc.png")); //转灰度图
}
//电脑屏幕截图
private Bitmap GetScreenCapture() {
Rectangle tScreenRect = new Rectangle(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Bitmap tSrcBmp = new Bitmap(tScreenRect.Width, tScreenRect.Height); // 用于屏幕原始图片保存
Graphics gp = Graphics.FromImage(tSrcBmp);
gp.CopyFromScreen(0, 0, 0, 0, tScreenRect.Size);
gp.DrawImage(tSrcBmp, 0, 0, tScreenRect, GraphicsUnit.Pixel);
tSrcBmp.Save(@"G:\新建文件夹\abc.png");
return tSrcBmp;
}
//RGB转灰度图片
public static Bitmap ImgRgbToGray(Bitmap bitmap) {
Bitmap b = new Bitmap(bitmap);
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmData.Stride; // 扫描的宽度
unsafe {
byte* p = (byte*)bmData.Scan0.ToPointer(); // 获取图像首地址
int nOffset = stride - b.Width * 3; // 实际宽度与系统宽度的距离
byte red, green, blue;
for (int y = 0; y < b.Height; ++y) {
for (int x = 0; x < b.Width; ++x) {
blue = p[0];
green = p[1];
red = p[2];
p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue); // RGB转灰度-转换公式
p += 3; // 跳过3个字节处理下个像素点
}
p += nOffset; // 加上间隔
}
}
b.UnlockBits(bmData); // 解锁
b.Save(@"G:\新建文件夹\abcd.png");
return b;
}
}
}
C#:电脑屏幕截图 , RGB图转灰度图片
猜你喜欢
转载自blog.csdn.net/qq_38261174/article/details/85266089
今日推荐
周排行