【发布时间】:2017-05-10 09:01:10
【问题描述】:
我有一个用户绘制的纹理(在移动设备上),我想将其编码为 jpg 以便用户可以与之共享,但我发现透明部分在编码的 jpg 中将是黑色的:
但我没有找到 texture2d.EncodeToJPG() 的任何覆盖方法来执行此操作。
有什么想法吗?
注意
鸟的翅膀是专门为Color.white 绘制的,因此它在编码的 jpg 中可能是白色的。
马上接近
我终于设法通过以下方式完成这项工作:
Color32[] pixels = text.GetPixels32();
Color blackTransparent = Color.black;
blackTransparent.a = 0;
for(int i = 0;i < pixels.Length; i++)
{
if(pixels[i] == blackTransparent)
{
pixels[i] = Color.white;
}
}
text.SetPixels32(pixels);
text.Apply();
但这会遍历纹理的所有像素,如果有人有更好的方法,请告诉我们。
这种方法的问题:
我们发现使用上面的代码在jpg上会有一些边缘(当遇到黑线时),可能需要一些图形处理知识来解决这个问题?
这是我们如何将图像加载到 texture2d(根据评论要求)
Texture2D text = new Texture2D(1, 1, TextureFormat.PVRTC_RGBA4, false);
byte[] imagebytes = null;
string path = "image/path/sample.png";
if (System.IO.File.Exists(path))
{
Debug.Log(" really load file from " + path);
imagebytes = System.IO.File.ReadAllBytes(path);
}
text.LoadImage(imagebytes, false);
【问题讨论】:
-
您可以改进该代码。您是在调用
texture2d.EncodeToJPG()之后还是之前运行该代码? -
@Programmer 我在
texture2d.EncodeToJPG()之前运行该代码 -
好的。我会给出一个答案来改进它。
-
我注意到您修改了您的问题以添加有关代码问题的信息....原始图像的来源是什么?原始格式是什么?
-
@Programmer 原始图片是 png 并且你在云端找到它here
标签: c# unity3d jpeg transparency