前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#截屏及图片处理

C#截屏及图片处理

作者头像
码客说
发布2023-06-04 15:44:36
4090
发布2023-06-04 15:44:36
举报
文章被收录于专栏:码客码客

截屏返回Bitmap

截图方法返回Bitmap可以方便后面对图片进行处理

截屏并绘制鼠标坐在位置

private const PixelFormat FORMAT = PixelFormat.Format24bppRgb;

public static Bitmap GetScreen()
{
    Bitmap screenshot = new Bitmap(
        Screen.PrimaryScreen.Bounds.Width,
        Screen.PrimaryScreen.Bounds.Height,
        FORMAT
    );
    using (Graphics gfx = Graphics.FromImage(screenshot))
    {
        gfx.CopyFromScreen(
            Screen.PrimaryScreen.Bounds.X,
            Screen.PrimaryScreen.Bounds.Y,
            0,
            0,
            Screen.PrimaryScreen.Bounds.Size,
            CopyPixelOperation.SourceCopy
        );

        // 绘制光标图标
        // 创建一个红色的画刷
        Brush brush = new SolidBrush(Color.LimeGreen);
        gfx.FillEllipse(
            brush,
            Cursor.Position.X - 10,
            Cursor.Position.Y - 10,
            20,
            20
        );
        return screenshot;
    }
}

缩放

public static Bitmap ScalePic
(
    Bitmap sourrce,
    int width,
    int height
)
{
    Bitmap result = new Bitmap(
        width,
        height,
        FORMAT
    );
    using (Graphics g = Graphics.FromImage(result))
    {
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(
            sourrce,
            0,
            0,
            width,
            height
        );
        return result;
    }
}

图片保存

使用默认方式

public static byte[] GetPicByte(Bitmap sourrce)
{
    using (MemoryStream ms = new MemoryStream())
    {
        sourrce.Save(
            ms,
            ImageFormat.Jpeg
        );
        return ms.ToArray();
    }
}

自定义压缩率

public static byte[] GetPicByte
(
    Bitmap sourrce,
    int quality
)
{
    using (MemoryStream ms = new MemoryStream())
    {
        ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
        var encoderParameters = GetEncoderParameters(quality);
        sourrce.Save(
            ms,
            jpegCodec,
            encoderParameters
        );
        return ms.ToArray();
    }
}

public static EncoderParameters GetEncoderParameters(int quality = 90)
{
    Encoder qualityEncoder = Encoder.Quality;
    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = new EncoderParameter(
        qualityEncoder,
        quality
    );
    return encoderParams;
}

/// <summary>
/// 获取解码器
/// </summary>
/// <param name="mimeType">
/// </param>
/// <returns>
/// </returns>
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
    int j;
    var encoders = ImageCodecInfo.GetImageEncoders();
    for (j = 0; j < encoders.Length; ++j)
    {
        if (encoders[j].MimeType == mimeType)
        {
            return encoders[j];
        }
    }
    return null;
}

保存到文件

bmp.Save(savePath, ImageFormat.Jpeg);

截屏并获取Byte

/// <summary>
/// 获取屏幕的Byte[]
/// </summary>
/// <param name="maxHeight"></param>
/// <returns></returns>
public static byte[] GetScreenshot(int maxHeight = 720)
{
    var screen = GetScreen();
    Bitmap targetPic;
    int width = screen.Width;
    int height = screen.Height;
    if (screen.Height > maxHeight)
    {
        double rate = 1.0d * screen.Height / maxHeight;
        height = (int)(height / rate);
        width = (int)(width / rate);
        targetPic = ScalePic(
            screen,
            width,
            height
        );
        screen.Dispose();
    }
    else
    {
        targetPic = screen;
    }
    var picByte = GetPicByte(
        targetPic,
        40
    );
    targetPic.Dispose();
    return picByte;
}

Bitmap转BGR格式

在做视频编码的时候,我们需要的是原始的BGR数据。

public static byte[] Bitmap2Bgr(Bitmap bitmap)
{
    BitmapData data = bitmap.LockBits(
        new Rectangle(
            0,
            0,
            bitmap.Width,
            bitmap.Height
        ),
        ImageLockMode.ReadWrite,
        PixelFormat.Format24bppRgb
    );
    bitmap.UnlockBits(data);
    int dstBytes = data.Stride * data.Height;
    byte[] dstValues = new byte[dstBytes];
    System.IntPtr srcPtr = data.Scan0;
    Marshal.Copy(
        srcPtr,
        dstValues,
        0,
        dstBytes
    );
    return dstValues;
}

获取屏幕并转为Bgr格式

/// <summary>
/// 获取屏幕并转为Bgr格式
/// </summary>
/// <param name="targetWidth"></param>
/// <param name="targetHeight"></param>
/// <returns></returns>
public static byte[] CaptureScreen
(
    int targetWidth,
    int targetHeight
)
{
    var screen = GetScreen();
    var targetPic = ScalePic(
        screen,
        targetWidth,
        targetHeight
    );
    screen.Dispose();
    byte[] bgrByte = Bitmap2Bgr(targetPic);
    targetPic.Dispose();
    return bgrByte;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 截屏返回Bitmap
  • 缩放
  • 图片保存
    • 使用默认方式
      • 自定义压缩率
        • 保存到文件
        • 截屏并获取Byte
        • Bitmap转BGR格式
        相关产品与服务
        图片处理
        图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档