C#怎么去了图片背景色并且可以调亮度
发布网友
发布时间:2024-09-26 06:00
我来回答
共1个回答
热心网友
时间:2024-11-15 17:00
您好,软糖来回答把,我做过一个去图片背景的程序。
核心实现就3句话,主要使用Bitmap.MakeTransparent方法
Bitmap bitmap2 = new Bitmap(pictureBox1.Image);
bitmap2.MakeTransparent(背景色);
pictureBox2.Image = bitmap2;
如果想要调整亮度,就要应用到GDI的图像特性ImageAttributes了
我这里有封装好的图像特性:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace 引擎.绘图.GDI
{
public class 图像特性 : IDisposable {
public 图像特性() {
M特性 = new ImageAttributes();
M矩阵 = 原始矩阵();
}
public 图像特性(float 透明度) {
M特性 = new ImageAttributes();
M矩阵 = 原始矩阵();
this.透明度 = 透明度;
}
public 图像特性(float 透明度, float gamma) {
M特性 = new ImageAttributes();
M矩阵 = 原始矩阵();
this.透明度 = 透明度;
M特性.SetGamma(gamma, ColorAdjustType.Bitmap);
}
ImageAttributes M特性;
ColorMatrix M矩阵;
float M亮度 = 1.0f;
bool M灰化 = false;
public ColorMatrixFlag 灰色底纹 = ColorMatrixFlag.Default;
public ColorAdjustType 色彩校正模式 = ColorAdjustType.Default;
public ImageAttributes 资源 { get { return 获取资源(); } }
protected virtual ImageAttributes 获取资源() { return M特性; }
protected virtual void 设置资源(ImageAttributes v特性) { M特性 = v特性; }
public ColorMatrix 矩阵 { get { return M矩阵; } }
public void 透明色 ( Color 颜色 ) { M特性.SetColorKey(颜色, 颜色); }
public void 设置gamma ( float gamma ) { M特性.SetGamma(gamma, ColorAdjustType.Bitmap); }
public void 清除色彩校正 () { M特性.SetNoOp(色彩校正模式); }
public bool 灰化 { get { return M灰化; } set { M灰化 = value; 灰度化(value); } }
public float 透明度 { get { return M矩阵[3, 3]; } set { M矩阵[3, 3] = value; 应用矩阵(); } }
public float R浓度 { get { return M矩阵[0, 0]; } set { M矩阵[0, 0] = value; 应用矩阵(); } }
public float G浓度 { get { return M矩阵[1, 1]; } set { M矩阵[1, 1] = value; 应用矩阵(); } }
public float B浓度 { get { return M矩阵[2, 2]; } set { M矩阵[2, 2] = value; 应用矩阵(); } }
public void 设置浓度 ( Color C )
{
float r = (float)C.R / 255f;
float g = (float)C.G / 255f;
float b = (float)C.B / 255f;
float a = (float)C.A / 255f;
M矩阵[0, 0] = r;
M矩阵[1, 1] = g;
M矩阵[2, 2] = b;
M矩阵[3, 3] = a;
应用矩阵();
}
public void 设置浓度 ( float R, float G, float B)
{
M矩阵[0, 0] = R;
M矩阵[1, 1] = G;
M矩阵[2, 2] = B;
应用矩阵();
}
public float 亮度
{
get { return M亮度; }
set
{
M亮度 = value;
M矩阵[4, 0] = M亮度;
M矩阵[4, 1] = M亮度;
M矩阵[4, 2] = M亮度;
应用矩阵();
}
}
public ColorMatrix 原始矩阵 ( )
{
float[][] t颜色矩阵元素 = {
new float[] {1, 0, 0, 0, 0}, // red scaling factor of 2
new float[] {0, 1, 0, 0, 0}, // green scaling factor of 1
new float[] {0, 0, 1, 0, 0}, // blue scaling factor of 1
new float[] {0, 0, 0, 1, 0}, // alpha scaling factor of 1
new float[] {0, 0, 0, 0, 1}};
return new ColorMatrix(t颜色矩阵元素);
}
public void 应用矩阵 ( ) {
if (M矩阵 == null) { M矩阵 = 原始矩阵(); };
M特性.SetColorMatrix(M矩阵);
}
public void 应用矩阵(Color C) {
float[][] t颜色矩阵元素 = {
new float[] { C.R / 255f, 0, 0, 0, 0},
new float[] {0, C.G / 255f, 0, 0, 0},
new float[] {0, 0, C.B / 255f, 0, 0},
new float[] {0, 0, 0, C.A / 255f, 0},
new float[] {0, 0, 0, 0, 1}};
M矩阵 = new ColorMatrix(t颜色矩阵元素);
M特性.SetColorMatrix(M矩阵);
}
public void 清空矩阵 ( ) { M特性.ClearColorMatrix(); }
protected void 灰度化(bool 应用)
{
if (应用 == true)
{
M矩阵[0, 0] = 0.3f; M矩阵[0, 1] = 0.3f; M矩阵[0, 2] = 0.3f;
M矩阵[1, 0] = 0.59f; M矩阵[1, 1] = 0.59f; M矩阵[1, 2] = 0.59f;
M矩阵[2, 0] = 0.11f; M矩阵[2, 1] = 0.11f; M矩阵[2, 2] = 0.11f;
应用矩阵();
}
else
{
float A = M矩阵[3, 3];
float L0 = M矩阵[4, 0]; float L1 = M矩阵[4, 1]; float L2 = M矩阵[4, 2];
M矩阵 = 原始矩阵();
M矩阵[3, 3]=A;M矩阵[4, 0]=L0;M矩阵[4, 1]=L1;M矩阵[4, 2]=L2;
应用矩阵();
}
}
public void Dispose()
{
M特性.Dispose();
}
}
}
用法
首先new一个图像特性
然后图像特性.亮度= 0.1f ~ 10.0f (设置float表示十分之一或十倍亮度)
最后调用绘制图像()方法,把图像特性填进去。
//画纸是Graphics
public GraphicsUnit 绘图单位 = GraphicsUnit.Pixel;
public void 绘制图像(Bitmap 图像, int X, int Y, int 宽, int 高, 图像特性 特性)
{ 画纸.DrawImage(位图, new Rectangle(X, Y, 宽, 高),
0, 0, 图像.Width, 图像.Height, 绘图单位, 特性.资源); }
满意请采纳,谢谢。