第一步肯定是要引入包啦, 站在巨人的肩膀上最舒服了.
System.Drawing.Common 这个这个.
我是直接在控制器里面操作的, 然后再转成流上传到OSS;
但是有一些方法可能会提示 仅能在windowns上使用(结果真的也是发布到linux确实不能用);
流程是这样的: 首先前端上传图片,以流的形式, 先把流转成图片, 加水印, 完了以后再把图片转成流, 然后上传到OSS(这一步这里没有, 但是简单阿里有给例子)
if (input.File.ContentType.Contains("image"))
{
using (var stream = new MemoryStream())
{
await input.File.CopyToAsync(stream);
// Add watermark
var watermarkedStream = new MemoryStream();
using (var img = Image.FromStream(stream))
{
using (var graphic = Graphics.FromImage(img))
{
var font = new Font(FontFamily.GenericSansSerif, 18, FontStyle.Italic, GraphicsUnit.Pixel);
var color = Color.FromArgb(0, 255, 0, 0);
var brush = new SolidBrush(Color.FromArgb(50, 100, 100, 100));
//graphic.RotateTransform(-45);
DrawTextOnImage(graphic, " 我是水印", font, brush, -500, 180, 100, img.Size);
img.Save(memoryStream, ImageFormat.Png);
await watermarkedStream.CopyToAsync(memoryStream);
graphic.Dispose();
}
}
}
}
else
{
await input.File.CopyToAsync(memoryStream);
}
调整水印的数量样式等等
/// <summary>
/// 生产水印
/// </summary>
/// <param name="grPhoto">水印图片</param>
/// <param name="strText">水印文字</param>
/// <param name="font">字体</param>
/// <param name="brush">笔刷(字体颜色)</param>
/// <param name="xStartPos">起始位置</param>
/// <param name="xSpace">x空位</param>
/// <param name="ySpace">y空位</param>
/// <param name="imageSize">原始图片</param>
private void DrawTextOnImage(Graphics grPhoto, string strText, Font font, Brush brush, int xStartPos, int xSpace, int ySpace, Size imageSize)
{
using var strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
grPhoto.RotateTransform(-30);
for (float y = xStartPos; y < imageSize.Height * 1.5; y += ySpace)
{
var ypos = y;
for (float x = xStartPos; x <= imageSize.Width * 1.5; x += xSpace)
{
var xpos = x;
grPhoto.DrawString(strText, //string of text
font, //font
brush, //Brush
xpos, ypos, //position
strFormat);
}
}
}