Untiy添加水印并保存(包含文字转图片并打水印)

405 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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,未测试其他平台。