出于调试目的将 texture2D 打印到文件或图像
printing a texture2D to file or as image for debugging purposes
我试图弄清楚图像在图像处理操作的几个阶段是如何处理的(它看起来像什么,等等...),所以我写了以下内容 co-routine
来捕获屏幕截图, 但我不确定如何 打印出 在不同阶段拍摄的照片(例如 png 图像 )
public void CaptureFrame(RectTransform rect)
{
StartCoroutine( Co_Capture(rect) );
}
private IEnumerator Co_Capture(RectTransform rect)
{
yield return new WaitForEndOfFrame();
_texture = new Texture2D( (int)rect.sizeDelta.x, (int)rect.sizeDelta.y );
_texture.ReadPixels( new Rect( rect.anchoredPosition.x - (rect.sizeDelta.x * 0.5f), rect.anchoredPosition.y - (rect.sizeDelta.y * 0.5f), rect.sizeDelta.x, rect.sizeDelta.y ), 0, 0 );
_texture.Apply();
OnImageCaptured( new ScreenShotEventArgs(_texture) );
}
鉴于我将应用程序构建到 Android 设备,理想情况下我希望将图像都保存在某个文件夹中(通过 Unity3D Editor) 以及设备上的 data
文件夹,例如。类似于 Debug.Log
您在不同阶段打印出来的消息,以查看代码的哪些部分已到达,等等...
我有什么选择?什么是 code/command/method 通过 Unity3D 保存 image/picture 以及 Android 平板电脑,以便开发人员可以看到各个阶段或处理的图像?
你在评论部分说得对。您使用 EncodeToPNG()
将其转换为字节数组,然后使用 File.WriteAllBytes
保存它。你没有做对的是路径。
如果您希望它在 Android、iOS 和任何平台上工作,请使用保存到 Application.persistentDataPath
。必须将其保存在文件夹中,而不是直接保存到Application.persistentDataPath
。
所以应该是 Application.persistentDataPath+"/yourfoldername/imagename.png"
。
同样,这:Application.persistentDataPath+"/imagename.png"
将在 iOS 上失败,因为您正试图直接写入需要我上面提到的文件夹的沙箱。
最后,我注意到您正在使用 +
连接路径。避免这样做,而是使用 Path.Combine
.
string tempPath = Path.Combine(Application.persistentDataPath, "yourfoldername");
tempPath = Path.Combine(tempPath, "yourfoldername.png");
这会将纹理保存为 Img1.png 在所有设备上的有效 public 位置。
File.WriteAllBytes(Path.Combine(Application.persistentDataPath + "Img1.png"), _texture.EncodeToPng());
我试图弄清楚图像在图像处理操作的几个阶段是如何处理的(它看起来像什么,等等...),所以我写了以下内容 co-routine
来捕获屏幕截图, 但我不确定如何 打印出 在不同阶段拍摄的照片(例如 png 图像 )
public void CaptureFrame(RectTransform rect)
{
StartCoroutine( Co_Capture(rect) );
}
private IEnumerator Co_Capture(RectTransform rect)
{
yield return new WaitForEndOfFrame();
_texture = new Texture2D( (int)rect.sizeDelta.x, (int)rect.sizeDelta.y );
_texture.ReadPixels( new Rect( rect.anchoredPosition.x - (rect.sizeDelta.x * 0.5f), rect.anchoredPosition.y - (rect.sizeDelta.y * 0.5f), rect.sizeDelta.x, rect.sizeDelta.y ), 0, 0 );
_texture.Apply();
OnImageCaptured( new ScreenShotEventArgs(_texture) );
}
鉴于我将应用程序构建到 Android 设备,理想情况下我希望将图像都保存在某个文件夹中(通过 Unity3D Editor) 以及设备上的 data
文件夹,例如。类似于 Debug.Log
您在不同阶段打印出来的消息,以查看代码的哪些部分已到达,等等...
我有什么选择?什么是 code/command/method 通过 Unity3D 保存 image/picture 以及 Android 平板电脑,以便开发人员可以看到各个阶段或处理的图像?
你在评论部分说得对。您使用 EncodeToPNG()
将其转换为字节数组,然后使用 File.WriteAllBytes
保存它。你没有做对的是路径。
如果您希望它在 Android、iOS 和任何平台上工作,请使用保存到 Application.persistentDataPath
。必须将其保存在文件夹中,而不是直接保存到Application.persistentDataPath
。
所以应该是 Application.persistentDataPath+"/yourfoldername/imagename.png"
。
同样,这:Application.persistentDataPath+"/imagename.png"
将在 iOS 上失败,因为您正试图直接写入需要我上面提到的文件夹的沙箱。
最后,我注意到您正在使用 +
连接路径。避免这样做,而是使用 Path.Combine
.
string tempPath = Path.Combine(Application.persistentDataPath, "yourfoldername");
tempPath = Path.Combine(tempPath, "yourfoldername.png");
这会将纹理保存为 Img1.png 在所有设备上的有效 public 位置。
File.WriteAllBytes(Path.Combine(Application.persistentDataPath + "Img1.png"), _texture.EncodeToPng());