Framwork/Assets/Test/ImageBlender.cs

84 lines
2.5 KiB
C#
Raw Permalink Normal View History

2025-05-23 16:24:00 +08:00
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class ImageBlender : MonoBehaviour
{
[Header("绑定设置")]
public Image imageA; // 底图
public Image imageB; // 顶图
public Shader blendShader;
[Header("导出设置")]
public string fileName = "Blended_Result";
public string saveFolder = "Exports";
void Start()
{
// 自动获取Shader可选
if (!blendShader) blendShader = Shader.Find("Custom/SimpleBlend");
}
[ContextMenu("执行混合导出")]
public void ExecuteBlendExport()
{
// 获取原始纹理
Texture2D texA = GetImageTexture(imageA);
Texture2D texB = GetImageTexture(imageB);
// 创建临时RenderTexture
RenderTexture rt = new RenderTexture(texA.width, texA.height, 24);
// 创建混合材质
Material blendMat = new Material(blendShader);
blendMat.SetTexture("_MainTex", texA);
blendMat.SetTexture("_BlendTex", texB);
// 执行混合
Graphics.Blit(null, rt, blendMat);
// 转换为Texture2D
Texture2D output = RenderTextureToTexture2D(rt);
// 保存文件
SaveTextureAsPNG(output);
// 清理资源
DestroyImmediate(rt);
DestroyImmediate(output);
}
Texture2D GetImageTexture(Image image)
{
// 从Image组件获取纹理
Sprite sprite = image.sprite;
Texture2D originTex = sprite.texture;
// 创建可读写副本
Texture2D copyTex = new Texture2D(originTex.width, originTex.height, originTex.format, false);
copyTex.SetPixels(originTex.GetPixels());
copyTex.Apply();
return copyTex;
}
Texture2D RenderTextureToTexture2D(RenderTexture rt)
{
RenderTexture.active = rt;
Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
tex.Apply();
RenderTexture.active = null;
return tex;
}
void SaveTextureAsPNG(Texture2D tex)
{
byte[] bytes = tex.EncodeToPNG();
string dirPath = Path.Combine(Application.streamingAssetsPath, saveFolder);
if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath);
string filePath = Path.Combine(dirPath, fileName + ".png");
File.WriteAllBytes(filePath, bytes);
Debug.Log($"导出成功:{filePath}");
}
}