示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 滤镜效果
/// </summary>
public class ImageFilter : MonoBehaviour
{
public RawImage rawImage;
public FilterEffect filterEffect;
public enum FilterEffect
{
None,
Gray,
Film,
SepiaTone
}
public bool OnStartApply = true;
private Texture2D rawTexture;
private void Awake()
{
if (rawImage == null)
rawImage = this.GetComponent<RawImage>();
}
void Start()
{
if (OnStartApply)
ApplyFilterEffect(filterEffect);
}
// 设置滤镜效果
public void ApplyFilterEffect(FilterEffect effect)
{
if (rawImage == null)
return;
// 去掉滤镜效果
if (effect == FilterEffect.None)
{
if (rawTexture != null)
rawImage.texture = rawTexture;
return;
}
if (rawTexture == null)
rawTexture = rawImage.texture as Texture2D;
Color[] colors = rawTexture.GetPixels(0, 0, rawTexture.width, rawTexture.height);
for (int i = 0; i < colors.Length; i++)
{
switch (effect)
{
case FilterEffect.Gray:
colors[i] = GrayEffect(colors[i]);
break;
case FilterEffect.Film:
colors[i] = FilmEffect(colors[i]);
break;
case FilterEffect.SepiaTone:
colors[i] = SepiaToneEffect(colors[i]);
break;
}
}
Texture2D clone_tex = new Texture2D(rawTexture.width, rawTexture.height, TextureFormat.RGBA32, false);
clone_tex.SetPixels(colors);
clone_tex.Apply();
rawImage.texture = clone_tex;
}
// 底片效果
private Color FilmEffect(Color c)
{
c.r = 1 - c.r;
c.g = 1 - c.g;
c.b = 1 - c.b;
return c;
}
// 老照片(一种发黄的颜色风格)
private Color SepiaToneEffect(Color c)
{
//重新计算RGB值
float fr = (c.r * 0.393f) + (c.g * 0.769f) + (c.b * 0.189f);
float fg = (c.r * 0.349f) + (c.g * 0.686f) + (c.b * 0.168f);
float fb = (c.r * 0.272f) + (c.g * 0.534f) + (c.b * 0.131f);
float blend_r = ColorBlend(Noise(), fr, c.r);
float blend_g = ColorBlend(Noise(), fg, c.g);
float blend_b = ColorBlend(Noise(), fb, c.b);
c.r = blend_r;
c.g = blend_g;
c.b = blend_b;
return c;
}
// 随机权重
private float Noise()
{
return Random.Range(0f, 1.0f) * 0.5f + 0.5f;
}
// 混合颜色
private float ColorBlend(float scale, float dest, float src)
{
return (scale * dest + (1.0f - scale) * src);
}
// 灰度图
private Color GrayEffect(Color c)
{
c.r *= 0.299f;
c.g *= 0.587f;
c.b *= 0.114f;
float gray = Mathf.Clamp01(c.r + c.g + c.b);
c.r = c.g = c.b = gray;
return c;
}
}
运行测试