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();
                }
            }
        }
    }
}
-----------------------------------
©著作权归作者所有:来自51CTO博客作者wx636261b2d66e0的原创作品,请联系作者获取转载授权,否则将追究法律责任
c#图像处理、图片拼接、图片裁剪、图片缩放、图上添加形状、屏幕截图、图片反色、改变图片色彩度全解
https://blog.51cto.com/u_15858929/6116541

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是将 BMP 图片反色处理的伪代码: ``` # 定义反色函数 def invert_colors(image): # 遍历图像的每一个像素 for i in range(image.height): for j in range(image.width): # 取出像素的 RGB 值 r, g, b = image.get_pixel(i, j) # 将 RGB 值取反 r = 255 - r g = 255 - g b = 255 - b # 将新的 RGB 值设置回像素 image.set_pixel(i, j, (r, g, b)) # 读入 BMP 图片 image = load_bmp("example.bmp") # 对图片进行反色处理 invert_colors(image) # 将处理后的图片保存 save_bmp(image, "inverted.bmp") ``` 在上面的代码中, `load_bmp` 和 `save_bmp` 函数用于读入和保存 BMP 图片, `get_pixel` 和 `set_pixel` 函数用于获取和设置图像中的像素值。 注意: 上面的代码仅供参考, 具体实现可能会有所不同。 ### 回答2: 反色处理是将图片中的每个像素点的颜色取反,实现方法如下: 1. 定义函数invertColor,输入参数为bmp图片的数据(像素矩阵)及其宽和高: 2. 创建一个新的空白图片矩阵newBmp,宽和高与输入图片一致; 3. 遍历输入图片的每个像素点: - 获取当前像素点的RGB值(红、绿、蓝值); - 将RGB值的每个分量(红、绿、蓝)取反(即255减去原来的值); - 将取反后的RGB值赋给新图片矩阵相同位置的像素点; 4. 返回处理后的新图片矩阵newBmp。 伪代码如下: ``` 函数 invertColor(bmp, width, height): newBmp = 创建一个宽为width,高为height的空白图片矩阵 for y = 0 to height-1: for x = 0 to width-1: r, g, b = 获取bmp[x][y]点的RGB值 r = 255 - r g = 255 - g b = 255 - b 新图片矩阵newBmp[x][y]的像素点的RGB值 = (r, g, b) return newBmp ``` ### 回答3: 下面是一个简单的伪代码,用于将BMP图片进行反色处理: ``` 1. 读取原始BMP图片文件 2. 将图片的宽和高保存到变量中 3. 创建一个新的空白BMP图片,使用和原始图片相同的宽和高 4. 循环遍历每个像素点的行和列: 4.1 获取原始图片中当前像素点的RGB值 4.2 计算反色后的RGB值,即将R、G、B值分别减去255 4.3 将反色后的RGB值设置为新图片中当前像素点的RGB值 5. 保存处理后的BMP图片到新的文件中 ``` 这是一个简单的反色处理过程,该过程通过对原始图片中的每个像素点的RGB值进行处理,得到反色后的RGB值,并将其设置为新图片中对应像素点的RGB值。最后,保存处理后的BMP图片到新的文件中。实际代码的实现可能会更加复杂,需要考虑文件读取和保存的操作,以及对像素点的遍历和处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值