c#图像处理、图片拼接、图片裁剪、图片缩放、图上添加形状、屏幕截图、图片反色、改变图片色彩度全解

全栈工程师开发手册 (作者:栾鹏)
c#教程全解


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace util
{
    public  class 图像处理类
    {
        //image是抽象体,bitmap是具体对象对应各种格式的位图
        public Pen 画笔 = new Pen(Brushes.Red);
        public static Bitmap 图片拼接(bool 横排拼接,Size 统一大小,params Bitmap[] 原图片组)
        {
            int i = 原图片组.Length;
            int 拼接宽度=0;
            int 拼接高度=0;
            int 总宽度 = 0;
            int 总高度 = 0;
            int 当前图片存放位置 = 0;
            bool 是否缩放 = true;
            Bitmap backgroudImg;
            if(统一大小.Width == 0 || 统一大小.Height ==0)
               是否缩放 = false;
            if (i == 0)
                throw new Exception("图片数不能够为0");
            if(!是否缩放)
            {
                 for (int j = 0; j < i; j++)
                {
                     if(原图片组[j].Width>拼接宽度)
                         拼接宽度 = 原图片组[j].Width;
                     if(原图片组[j].Height>拼接高度)
                         拼接高度 = 原图片组[j].Height;
                     总宽度 = 总宽度 + 原图片组[j].Width;
                     总高度 = 总高度 + 原图片组[j].Height;
                }
            }
            else 
            {
                拼接宽度 = 统一大小.Width;
                拼接高度 = 统一大小.Height;
                总高度 = 拼接高度 * i;
                总宽度 = 拼接宽度 * i;
                for (int j = 0; j < i; j++)
                {  
                    if(横排拼接)
                        原图片组[j] = (Bitmap)原比例图片缩放((Image)原图片组[j], (float)拼接高度 / 原图片组[j].Height);
                    else
                        原图片组[j] = (Bitmap)原比例图片缩放((Image)原图片组[j], (float)拼接宽度 / 原图片组[j].Width);
                }
            }
            //创建要显示的图片对象,根据参数的个数设置宽度
            if(横排拼接)
                 backgroudImg = new Bitmap(总宽度, 拼接高度);
            else
                 backgroudImg = new Bitmap(拼接宽度,总高度);
            Graphics g = Graphics.FromImage(backgroudImg);
            //清除画布,背景设置为白色
            g.Clear(System.Drawing.Color.White);
            if (横排拼接)
                for (int j = 0; j < i; j++)
                {
                    g.DrawImage(原图片组[j], 当前图片存放位置, 0, 原图片组[j].Width, 原图片组[j].Height);
                    当前图片存放位置 = 当前图片存放位置 + 原图片组[j].Width;
                }
            else
                for (int j = 0; j < i; j++)
                {
                    g.DrawImage(原图片组[j], 0, 当前图片存放位置, 原图片组[j].Width, 原图片组[j].Height);
                    当前图片存放位置 = 当前图片存放位置 + 原图片组[j].Height;
                }
            g.Dispose();
            return backgroudImg;
        }
        public static Bitmap 图片裁剪(Rectangle 裁剪范围, Image 原图片)
        {
            Bitmap b = new Bitmap(原图片);
            return  b.Clone(裁剪范围, System.Drawing.Imaging.PixelFormat.DontCare);
        }
        //Image 赋值,只是将指针传递,new bitmap()才真正赋值
        public static Image 图片缩放(Image 原图片, int 新宽, int 新高)
        {
            Image newImg = 原图片.GetThumbnailImage(新宽, 新高, new Image.GetThumbnailImageAbort(IsTrue), IntPtr.Zero); // 对原图片进行缩放 return newImg;
            GC.Collect();
            return newImg;
        }
        public static Image 原比例图片缩放(Image 原图片, float 缩放比例)
        {
            Image newImg = 原图片.GetThumbnailImage((int)(原图片.Width * 缩放比例), (int)(原图片.Height * 缩放比例), new Image.GetThumbnailImageAbort(IsTrue), IntPtr.Zero); // 对原图片进行缩放 return newImg;
            GC.Collect();
            return newImg;
        }
        private static bool IsTrue() // 在 Image 类别对图片进行缩放的时候,需要一个返回 bool 类别的委托 
        { return true; }
        public static Image 图上添加矩形框(Image 原图片, Point 起点, Point 终点,Pen 钢笔)
        {
            Graphics painter = Graphics.FromImage(原图片);//在图片的上一图层上画矩形
            painter.DrawRectangle(钢笔, Math.Min(起点.X, 终点.X), Math.Min(起点.Y, 终点.Y), Math.Abs(起点.X - 终点.X), Math.Abs(起点.Y - 终点.Y));
            GC.Collect();
            return 原图片;
        }
        public Image 图上添加椭圆框(Image 原图片, Point 起点, Point 终点, Color 颜色)
        {
            画笔.Color = 颜色;
            Graphics painter = Graphics.FromImage(原图片);
            painter.DrawEllipse(画笔, Math.Min(起点.X, 终点.X), Math.Min(起点.Y, 终点.Y), Math.Abs(起点.X - 终点.X), Math.Abs(起点.Y - 终点.Y));
            GC.Collect();
            return 原图片;
        }
        public Image 图上添加实心矩形(Image 原图片, Point 起点, Point 终点, Color 颜色, int 透明度)
        {
            Graphics painter = Graphics.FromImage(原图片);
            painter.FillRectangle(new SolidBrush(Color.FromArgb(透明度, 颜色.R, 颜色.G, 颜色.B)), (int)Math.Min(起点.X, 终点.X), (int)Math.Min(起点.Y, 终点.Y), Math.Abs(起点.X - 终点.X), Math.Abs(起点.Y - 终点.Y));
            GC.Collect();
            return 原图片;
        }
        public Image 屏幕截图(Point 起点, Point 终点)
        {
            Image img = new Bitmap(Math.Abs(起点.X - 终点.X), Math.Abs(起点.Y - 终点.Y));
            Graphics g = Graphics.FromImage(img);
            g.CopyFromScreen(起点, new Point(0, 0), new Size(Math.Abs(起点.X - 终点.X), Math.Abs(起点.Y - 终点.Y)));
            return img;
        }
        public Image 改变图片色彩度(Image 原图片,int 颜色透明度)
        {
            Bitmap img = new Bitmap(原图片);
            using (Bitmap bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.DrawImage(img, 0, 0);
                    for (int h = 0; h < img.Height; h++)
                    {
                        for (int w = 0; w < img.Width; w++)
                        {
                            Color c = img.GetPixel(w, h);
                            bmp.SetPixel(w, h, Color.FromArgb(颜色透明度, c.R, c.G, c.B));//色彩度最大为255,最小为0
                        }
                    }
                    GC.Collect();
                    return (Image)bmp.Clone();
                }
            }
        }
        public Image 图片反色(Image 原图片)
        {
            Bitmap img = new Bitmap(原图片);
            using (Bitmap bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    //g.DrawImage(img, 0, 0);
                    for (int h = 0; h < img.Height; h++)
                    {
                        for (int w = 0; w < img.Width; w++)
                        {
                            Color c = img.GetPixel(w, h);
                            bmp.SetPixel(w, h, Color.FromArgb( 255-c.R, 255-c.G, 255-c.B));
                        }
                    }
                    GC.Collect();
                    return (Image)bmp.Clone();
                }
            }
        }
        public Image 图片裁剪(Image 原图片, Point 起点, Point 终点)
        {
            Bitmap img = new Bitmap(原图片);
            using (Bitmap bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                //    g.DrawImage(img, 0, 0);
                    for (int h = Math.Min(起点.Y, 终点.Y) - 1; h < Math.Max(起点.Y, 终点.Y); h++)
                    {
                        for (int w = Math.Min(起点.X, 终点.X) - 1; w < Math.Max(起点.X, 终点.X); w++)
                        {
                            Color c = img.GetPixel(w, h);
                            bmp.SetPixel(w, h, Color.FromArgb(255, c.R, c.G, c.B));//色彩度最大为255,最小为0
                        }
                    }
                    GC.Collect();
                    return (Image)bmp.Clone();
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯AI架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值