携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
1、添加水印
主体思路是,通过坐标,得到要添加水印像素点,Color.Lerp
得到目标颜色值,SetPixel
重绘该点颜色。
代码如下:
/// <summary>
/// 添加水印
/// </summary>
/// <param name="background">背景图</param>
/// <param name="watermark">水印</param>
/// <param name="foffsetX">x偏移量</param>
/// <param name="offsetY">y偏移量</param>
/// <returns>结果图</returns>
private Texture2D AddWatermark(Texture2D background, Texture2D watermark,int foffsetX,int offsetY)
{
int startX = background.width - watermark.width - foffsetX;
int endX = startX + watermark.width;
int startY = offsetY;
int endY = startY + watermark.height;
for (int x = startX; x < endX; x++)
{
for (int y = startY; y < endY; y++)
{
Color bgColor = background.GetPixel(x, y);
Color wmColor = watermark.GetPixel(x - startX, y - startY);
Color final_color = Color.Lerp(bgColor, wmColor, wmColor.a / 1.0f);
background.SetPixel(x, y, final_color);
}
}
background.Apply();
return background;
}
2、文字转图片功能
注意:此功能需要在工程中添加 System.Drawing.dll
首先将字体转为Bitmap,但此处会出现一个问题,将bitmap作为贴图在图片上打水印,水印会有背景,但又没找到方法将字体直接转为PNG,所以,曲线救国,将bitmap存储到本地png图片,然后获取该透明图片并打水印(会继续寻找方法,直接转化为png)。
代码如下:
/// <summary>
/// 文字转图片
/// </summary>
/// <param name="text">文字内容</param>
/// <param name="fontSize">字体大小</param>
/// <param name="paddingLeft">左边距</param>
/// <param name="paddingTop">上边距</param>
/// <param name="textColor">字体颜色</param>
private Texture2D TextToPicture(string text, float fontSize, int paddingLeft, int paddingTop, System.Drawing.Color textColor)
{
System.Drawing.Font textFont = new System.Drawing.Font("宋体", fontSize);
System.Drawing.Bitmap bm = new System.Drawing.Bitmap((int)(text.Length * (fontSize + 40)), (int)(fontSize + 40));
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bm);
System.Drawing.Brush b = new System.Drawing.SolidBrush(textColor);
g.DrawString(text, textFont, b, paddingLeft, paddingTop);
bm.Save(dirPath + "/UserName.png", System.Drawing.Imaging.ImageFormat.Png);
Texture2D tex = GetPicture(dirPath + "/UserName.png");
File.Delete(dirPath + "/UserName.png");
g.Dispose();
bm.Dispose();
return tex;
}
3、注意
保存图片的话,需要使用协程,等图片绘制完成后,再进行后续操作。
因为当前为本地存储,所以可能会涉及到权限问题,dll使用平台为PC,未测试其他平台。