• C# 图像处理(图像缩放、屏幕截取、图像合并、保存图像)


    # region 图像处理功能函数

    /// <summary>
    /// 按指定尺寸对图像pic进行非拉伸缩放
    /// </summary>
    public static Bitmap shrinkTo(Image pic, Size S, Boolean cutting)
    {
    //创建图像
    Bitmap tmp = new Bitmap(S.Width, S.Height); //按指定大小创建位图

    //绘制
    Graphics g = Graphics.FromImage(tmp); //从位图创建Graphics对象
    g.Clear(Color.FromArgb(0, 0, 0, 0)); //清空

    Boolean mode = (float)pic.Width / S.Width > (float)pic.Height / S.Height; //zoom缩放
    if (cutting) mode = !mode; //裁切缩放

    //计算Zoom绘制区域
    if (mode)
    S.Height = (int)((float)pic.Height * S.Width / pic.Width);
    else
    S.Width = (int)((float)pic.Width * S.Height / pic.Height);
    Point P = new Point((tmp.Width - S.Width) / 2, (tmp.Height - S.Height) / 2);

    g.DrawImage(pic, new Rectangle(P, S));

    return tmp; //返回构建的新图像
    }

    [DllImport("user32.dll")]
    static extern bool GetCursorInfo(out CURSORINFO pci);

    private const Int32 CURSOR_SHOWING = 0x00000001;
    [StructLayout(LayoutKind.Sequential)]
    struct POINT
    {
    public Int32 x;
    public Int32 y;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct CURSORINFO
    {
    public Int32 cbSize;
    public Int32 flags;
    public IntPtr hCursor;
    public POINT ptScreenPos;
    }

    /// <summary>
    /// 截取屏幕指定区域为Image,保存到路径savePath下,haveCursor是否包含鼠标
    /// </summary>
    public static Image getScreen(int x=0, int y=0, int width=-1, int height=-1, String savePath="", bool haveCursor = true)
    {
    if (width == -1) width = SystemInformation.VirtualScreen.Width;
    if (height == -1) height = SystemInformation.VirtualScreen.Height;

    Bitmap tmp = new Bitmap(width, height); //按指定大小创建位图
    Graphics g = Graphics.FromImage(tmp); //从位图创建Graphics对象
    g.CopyFromScreen(x, y, 0, 0, new Size(width, height)); //绘制

    // 绘制鼠标
    if (haveCursor)
    {
    CURSORINFO pci;
    pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO));
    GetCursorInfo(out pci);
    System.Windows.Forms.Cursor cur = new System.Windows.Forms.Cursor(pci.hCursor);
    cur.Draw(g, new Rectangle(pci.ptScreenPos.x, pci.ptScreenPos.y, cur.Size.Width, cur.Size.Height));
    }

    if (!savePath.Equals("")) saveIcon(tmp, tmp.Size, savePath); // 保存到指定的路径下

    return tmp; //返回构建的新图像
    }


    //在图像pic上添加logo
    public static Bitmap SetLogo(Image pic, Image logo)
    {
    //创建图像
    Bitmap tmp = new Bitmap(pic.Width, pic.Height);//按指定大小创建位图

    //绘制
    Graphics g = Graphics.FromImage(tmp); //从位图创建Graphics对象
    g.Clear(Color.FromArgb(0, 0, 0, 0)); //清空

    g.DrawImage(pic, 0, 0); //从pic的给定区域进行绘制
    g.DrawImage(logo, 0, 0); //为图像添加logo

    return tmp; //返回构建的新图像
    }


    //保存图像pic到文件fileName中,指定图像保存格式
    public static void SaveToFile(Image pic, string fileName, bool replace, ImageFormat format) //ImageFormat.Jpeg
    {
    //若图像已存在,则删除
    if (System.IO.File.Exists(fileName) && replace)
    System.IO.File.Delete(fileName);

    //若不存在则创建
    if (!System.IO.File.Exists(fileName))
    {
    if (format == null) format = getFormat(fileName); //根据拓展名获取图像的对应存储类型

    if (format == ImageFormat.MemoryBmp) pic.Save(fileName);
    else pic.Save(fileName, format); //按给定格式保存图像
    }
    }

    //根据文件拓展名,获取对应的存储类型
    public static ImageFormat getFormat(string filePath)
    {
    ImageFormat format = ImageFormat.MemoryBmp;
    String Ext = System.IO.Path.GetExtension(filePath).ToLower();

    if (Ext.Equals(".png")) format = ImageFormat.Png;
    else if (Ext.Equals(".jpg") || Ext.Equals(".jpeg")) format = ImageFormat.Jpeg;
    else if (Ext.Equals(".bmp")) format = ImageFormat.Bmp;
    else if (Ext.Equals(".gif")) format = ImageFormat.Gif;
    else if (Ext.Equals(".ico")) format = ImageFormat.Icon;
    else if (Ext.Equals(".emf")) format = ImageFormat.Emf;
    else if (Ext.Equals(".exif")) format = ImageFormat.Exif;
    else if (Ext.Equals(".tiff")) format = ImageFormat.Tiff;
    else if (Ext.Equals(".wmf")) format = ImageFormat.Wmf;
    else if (Ext.Equals(".memorybmp")) format = ImageFormat.MemoryBmp;

    return format;
    }

    # endregion

  • 相关阅读:
    POJ1182
    poj3225 线段树区间操作 (见鬼)
    斜率优化dp(POJ1180 Uva1451)
    POJ2528 线段树的区间操作
    POI2001 Gold mine(二叉排序树 黑书经典)
    POJ3921
    博弈论之威佐夫博弈(转载)
    poj3468(线段树 边覆盖)
    hdu 1166(树状数组 或 线段树)
    压缩软件的改进--- (续先前霍夫曼编码)
  • 原文地址:https://www.cnblogs.com/stoneG/p/7212100.html
Copyright © 2020-2023  润新知