111,097
社区成员




/// <summary>
/// 替换颜色
/// </summary>
/// <param name="tr">红值</param>
/// <param name="tg">绿值</param>
/// <param name="tb">蓝值</param>
/// <param name="src">替换的图像</param>
/// <param name="opacity">整体透明度</param>
/// <param name="trans">替换为透明度</param>
/// <returns></returns>
public Bitmap ReplaceToColor(int tr, int tg, int tb, Bitmap src, int opacity, int trans)
{
int w = src.Width;
int h = src.Height;
Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Imaging.BitmapData srcData = src.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle(0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
unsafe
{
byte* pIn = (byte*)srcData.Scan0.ToPointer();
byte* pOut = (byte*)dstData.Scan0.ToPointer();
byte* p;
int stride = srcData.Stride;
int r, g, b;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
p = pIn;
b = pIn[0];
g = pIn[1];
r = pIn[2];
pOut[1] = (byte)g;
pOut[2] = (byte)r;
if (r == tr && g == tg && b == tb)
{
pOut[3] = (byte)trans;
}
else
{
dots.Add(new Dot(new Point(x, y)));
pOut[3] = (byte)opacity;
}
pOut[0] = (byte)b;
pIn += 4;
pOut += 4;
}
pIn += srcData.Stride - w * 4;
pOut += srcData.Stride - w * 4;
}
src.UnlockBits(srcData);
dstBitmap.UnlockBits(dstData);
return dstBitmap;
}
}
public void DrawTransparent()
{
Bitmap bmp1 = new Bitmap(100, 100);
//随便截图绘制个底图
using (Graphics g = Graphics.FromImage(bmp1))
{
Rectangle ScreenArea = Screen.GetWorkingArea(Screen.PrimaryScreen.WorkingArea);
g.CopyFromScreen(0, 0, 0, 0, new Size(ScreenArea.Width, ScreenArea.Height));
}
Bitmap bmp2 = new Bitmap(100, 100);
//弄个新bmp,画个“王”
using (Graphics g = Graphics.FromImage(bmp2))
{
g.Clear(Color.White);
g.DrawString("王", SystemFonts.DefaultFont, Brushes.Yellow, 20, 20);
}
//绘制过去
using (Graphics g = Graphics.FromImage(bmp1))
{
System.Drawing.Imaging.ImageAttributes attributes = new System.Drawing.Imaging.ImageAttributes();
attributes.SetColorKey(bmp2.GetPixel(0, 0), bmp2.GetPixel(0, 0));//取bmp2左上角像素作为透明背景
g.DrawImage(bmp2, new Rectangle(0, 0, 100, 100), 0, 0, bmp2.Width, bmp2.Height, GraphicsUnit.Pixel, attributes);
}
bmp1.Save("demo.png", System.Drawing.Imaging.ImageFormat.Png);
}
针对你的问题,写了个demo