C#图片加水印,各论坛非常有用
///
/// 绘制水印(图片)
///
/// 原图
/// 水印图片
/// 透明色
/// 起始点
///
/// 不透明度
///
private Bitmap DrawWatermark(Image image, Bitmap wmImg, Color key,int x, int y, double opacity)
{
Bitmap bm1 = new Bitmap(image);
Bitmap bm2 = new Bitmap(wmImg.Width, wmImg.Height);
Graphics g2 = Graphics.FromImage(bm2);
ImageAttributes att = new ImageAttributes();
att.SetColorKey(key, key, ColorAdjustType.Bitmap);
g2.DrawImage(bm1, 0, 0, new Rectangle(x, y, bm2.Width, bm2.Height), GraphicsUnit.Pixel);
g2.DrawImage(wmImg, new Rectangle(0,0,bm2.Width,bm2.Height),0, 0,bm2.Width,bm2.Height,GraphicsUnit.Pixel,att);
g2.Dispose();
BitmapData data1 = bm1.LockBits(new Rectangle(0, 0, bm1.Width, bm1.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData data2 = bm2.LockBits(new Rectangle(0, 0, bm2.Width, bm2.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p1 = (byte*)(void*)data1.Scan0;
byte* p2 = (byte*)(void*)data2.Scan0;
for (int j = 0; j < bm2.Height; j++)
{
for (int i = 0; i < bm2.Width * 3; i++)
{
p1[(y + j) * data1.Stride + i] = (byte)(p1[(y + j) * data1.Stride + i] * (1 - opacity) + opacity * p2[j * data2.Stride + i]);
}
}
bm1.UnlockBits(data1);
bm2.UnlockBits(data2);
}
return bm1;
}
}