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的原创作品,请联系作者获取转载授权,否则将追究法律责任