下面就来详细讲解如何实现“Unity实现图片水印生成”的完整攻略。
需求分析
在实现图片水印生成之前,我们需要先对需求进行分析:
- 将水印添加到图片上
- 水印可配置:水印文字内容、字体、大小、颜色、位置、透明度等
- 输出带水印的图片
实现步骤
1. 下载字体文件
首先我们需要下载所需的字体文件。可以在字体网站上寻找并不断尝试,也可以在自己电脑上的字体目录中找到。
2. 创建Canvas
在Unity中,我们首先需要创建一个Canvas,在Canvas下创建一个Image用于显示图片。
3. 加载图片
使用Texture2D类加载需要添加水印的图片。
// 加载图片
Texture2D photo = Resources.Load<Texture2D>("test");
4. 创建水印文本
使用TextMeshProUGUI组件创建水印文本。
// 加载字体文件
Font font = Resources.Load<Font>("font");
// 创建TextMeshProUGUI组件并设置属性
GameObject textObj = new GameObject("Text");
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Watermark";
text.font = font;
text.fontSize = 24;
text.color = Color.black;
text.alignment = TextAlignmentOptions.Center;
5. 生成水印纹理
创建水印纹理,并将文本绘制到水印纹理上。
// 创建水印纹理
Texture2D watermark = new Texture2D(text.preferredWidth, text.preferredHeight, TextureFormat.RGBA32, false);
// 获取水印纹理的像素颜色数组
Color[] pixels = watermark.GetPixels();
// 绘制水印文本
text.rectTransform.pivot = new Vector2(0.5f, 0.5f);
text.rectTransform.position = new Vector2(text.preferredWidth / 2, text.preferredHeight / 2);
Canvas canvas = textObj.AddComponent<Canvas>();
canvas.overrideSorting = true;
canvas.sortingOrder = 1000;
CanvasScaler cs = textObj.AddComponent<CanvasScaler>();
cs.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
cs.referenceResolution = new Vector2(1920, 1080);
GraphicRaycaster gr = textObj.AddComponent<GraphicRaycaster>();
CanvasRenderer cr = textObj.AddComponent<CanvasRenderer>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.worldCamera = Camera.main;
canvas.planeDistance = 10;
canvas.enabled = false;
textObj.SetActive(true);
textObj.transform.localScale = new Vector3(1, 1, 1);
canvas.enabled = true;
watermark.ReadPixels(new Rect(0, 0, text.preferredWidth, text.preferredHeight), 0, 0);
watermark.Apply();
6. 将水印纹理叠加到原图片上
将水印纹理叠加到原图片上,并生成带水印的新图片。
// 将水印纹理叠加到原图片上
for (int i = 0; i < watermark.width; i++)
{
for (int j = 0; j < watermark.height; j++)
{
Color color1 = photo.GetPixel(i, j);
Color color2 = watermark.GetPixel(i, j);
color2.a = 0.5f;
photo.SetPixel(i, j, Color.Lerp(color1, color2, color2.a));
}
}
// 生成带水印的新图片
byte[] bytes = photo.EncodeToPNG();
File.WriteAllBytes(Application.dataPath + "/../watermark.png", bytes);
示例说明
下面提供两个示例,展示如何对不同的水印需求进行实现:
示例1:简单文字水印
- 水印文字内容:Hello World
- 字体:Arial
- 大小:32
- 颜色:红色
- 位置:右下角
- 透明度:0.5
// 加载字体文件
Font font = Resources.Load<Font>("Arial");
// 创建TextMeshProUGUI组件并设置属性
GameObject textObj = new GameObject("Text");
TextMeshProUGUI text = textObj.AddComponent<TextMeshProUGUI>();
text.text = "Hello World";
text.font = font;
text.fontSize = 32;
text.color = new Color(1, 0, 0, 0.5f);
text.alignment = TextAlignmentOptions.BottomRight;
示例2:自定义Logo水印
- 水印:公司Logo
- 位置:居中
- 透明度:0.8
// 加载公司Logo图片
Texture2D logo = Resources.Load<Texture2D>("CompanyLogo");
// 根据Logo创建水印纹理
Texture2D watermark = new Texture2D(logo.width, logo.height, TextureFormat.RGBA32, false);
watermark.SetPixels(logo.GetPixels());
watermark.Apply();
// 将水印纹理绘制到画布上
GameObject watermarkObj = new GameObject("Watermark");
Canvas canvas = watermarkObj.AddComponent<Canvas>();
canvas.overrideSorting = true;
canvas.sortingOrder = 1000;
CanvasScaler cs = watermarkObj.AddComponent<CanvasScaler>();
cs.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
cs.referenceResolution = new Vector2(1920, 1080);
GraphicRaycaster gr = watermarkObj.AddComponent<GraphicRaycaster>();
CanvasRenderer cr = watermarkObj.AddComponent<CanvasRenderer>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.worldCamera = Camera.main;
canvas.planeDistance = 10;
// 将画布和水印纹理绑定
canvas.enabled = false;
Image image = watermarkObj.AddComponent<Image>();
image.sprite = Sprite.Create(watermark, new Rect(0, 0, watermark.width, watermark.height), new Vector2(0.5f, 0.5f));
image.rectTransform.pivot = new Vector2(0.5f, 0.5f);
watermarkObj.SetActive(true);
// 设置水印透明度
Color color = image.color;
color.a = 0.8f;
image.color = color;
通过以上两个示例,我们可以看到如何通过代码实现不同的水印需求,并成功实现生成带水印的图片。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity实现图片水印生成 - Python技术站