Framwork/Assets/Test/ImageBlender.cs

84 lines
2.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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}");
}
}