Делаем скриншот с наложением ватермарк

Стандартная функция Application.CaptureScreenshot удобная в плане использования, но нам нужно наложить водяной знак, смешать две текстуры. Поэтому напишем небольшой скрипт, который по сути будет снимать такой-же снимок экрана, как и стандартная функция, плюс, накладывать поверх еще одну текстуру. Кроме того, будет несколько настроек для ватермарки, чтобы его можно было расположить по углам с добавлением отступа. Автоматического изменения размера ватермарки нет, для этих целей есть пример специального скрипта в Unity wiki, ссылка на статью смотрите ниже по тексту. Здесь, мы рассмотрим, как снять скриншот и смешать его с другим изображением.

Для начала создаем новую папку, например Screenshots. Для редактора создаем ее рядом с папкой Assets вашего проекта, а после сборки игры рядом с папкой xxx_Data. Ну и разумеется рисуем свой "водяной знак" в разрешении, допустим 400х150.

Настройки импорта для ватермарк:

Делаем скриншот с наложением ватермарк


Ну и цепляем на камеру скрипт TakeScreenshot:

using UnityEngine;
using System.Collections;
using System.IO;

public class TakeScreenshot : MonoBehaviour {

	public KeyCode _KeyCode = KeyCode.F10;
	public Texture2D watermark;
	public string folder = "Screenshots";
	public enum Mode {topLeft = 0, topRight = 1, bottomLeft = 2, bottomRight = 3};
	public Mode mode = Mode.bottomRight;
	public int border = 25;
	
	private int width;
	private int height;
	private Texture2D tex;
	private Texture2D tmp;
	private bool isAdd;

	string ScreenshotName() 
	{
		return string.Format("{0}/shot_{3}_{1}x{2}.png", 
		                     folder, 
		                     width, height, 
		                     System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
	}

	void LateUpdate() 
	{
		if(Input.GetKeyDown(_KeyCode))
		{
			width = Screen.width;
			height = Screen.height;
			if(watermark.width > width || watermark.height > height) isAdd = false; else isAdd = true;
			Shot();
		}
	}

	Texture2D AddWatermark(Texture2D background, Texture2D add)
	{
		int startX = 0;
		int startY = 0;
		int endY = 0;
		int endX = 0;

		switch(mode)
		{
		case Mode.topLeft:
			startX = border;
			startY = background.height - (add.height + border);
			endY = background.height - border;
			endX = add.width;
			break;
		case Mode.topRight:
			startX = background.width - (add.width + border);
			startY = background.height - (add.height + border);
			endY = background.height - border;
			endX = background.width - border;
			break;
		case Mode.bottomLeft:
			startX = border;
			startY = border;
			endY = add.height + border;
			endX = add.width;
			break;
		case Mode.bottomRight:
			startX = background.width - (add.width + border);
			startY = border;
			endY = add.height + border;
			endX = background.width - border;
			break;
		}
		
		for (int x = startX; x < endX; x++)
		{
			
			for (int y = startY; y < endY; y++)
			{
				Color bgColor = background.GetPixel(x, y);
				Color wmColor = add.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;
	}

	void Shot()
	{
		StartCoroutine(Screenshot());
	}

	IEnumerator Screenshot()
	{
		yield return new WaitForEndOfFrame();
		tex = new Texture2D( width, height, TextureFormat.RGB24, false );
		tex.ReadPixels( new Rect( 0, 0, width, height ), 0, 0 );
		tex.Apply();

		if(watermark && isAdd) tmp = AddWatermark(tex, watermark); else tmp = tex;
		byte[] bytes = tmp.EncodeToPNG();
		string filename = ScreenshotName();
		File.WriteAllBytes(filename, bytes);
		Debug.Log("Сохранение скриншота: " + filename);
	}
}

_KeyCode - клавиша снятия скриншота.

watermark - собственно сам ватермарк.

folder - папка для сохранения.

mode - выбор места для наложения.

border - отступ по сторонам.

Если разрешение "водяного знака" по ширине или высоте больше, что текущее разрешение экрана, или отсутствует - то он не будет наложен. Прозрачность сохраняется. Если вы хотите сделать, чтобы разрешение ватермарки можно было изменить через скрипт, кликаем здесь.

Комментариев 3

Офлайн
temich777e 1 июня 2017
А что делать в версии 5.6.0?
ТАм не такие настройки текстуры mask
Вот фотки:
https://yadi.sk/i/GykzQmpQ3JjcYz
https://yadi.sk/i/RQMMJSyg3JjcYg
Офлайн
Light 1 июня 2017
temich777e, выбрать режим по умолчанию.

Офлайн
temich777e 2 июня 2017
Light,
спасибо!
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика