2025-03-26 00:02:56 +08:00

79 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#unity/日常积累
# [ImageConversion](https://docs.unity.cn/cn/current/ScriptReference/ImageConversion.html).EncodeToPNG
public static byte[] EncodeToPNG ([Texture2D](https://docs.unity.cn/cn/current/ScriptReference/Texture2D.html) tex);
## 参数
tex
要转换的纹理。
## 描述
将该纹理编码为 PNG 格式。
返回的字节数组为 PNG“文件”。您可以将它们写入磁盘以获取 PNG 文件, 或通过网络发送等。
This function works only on uncompressed, non-HDR texture formats. [Texture.isReadable](https://docs.unity.cn/cn/current/ScriptReference/Texture-isReadable.html) must be `true`.
The encoded PNG data will contain alpha channel for `RGBA32`, `ARGB32` textures, and no alpha channel for `RGB24` textures. For single-channel red textures ( `R8`, `R16`, `RFloat` and `RHalf` ), the encoded PNG data will be in grayscale. PNG data will not contain gamma correction or color profile information.
``` cs
// Saves screenshot as PNG file.
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.IO;
public class PNGUploader : MonoBehaviour
{
// Take a shot immediately
IEnumerator Start()
{
yield return UploadPNG();
}
IEnumerator UploadPNG()
{
// We should only read the screen buffer after rendering is complete
yield return new WaitForEndOfFrame();
// Create a texture the size of the screen, RGB24 format
int width = Screen.width;
int height = Screen.height;
Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
// Read screen contents into the texture
tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
tex.Apply();
// Encode texture into PNG
byte[] bytes = tex.EncodeToPNG();
Object.Destroy(tex);
// For testing purposes, also write to a file in the project folder
// File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);
// Create a Web Form
WWWForm form = new WWWForm();
form.AddField("frameCount", Time.frameCount.ToString());
form.AddBinaryData("fileUpload", bytes);
// Upload to a cgi script
var w = UnityWebRequest.Post("http://localhost/cgi-bin/env.cgi?post", form);
yield return w.SendWebRequest();
if (w.result != UnityWebRequest.Result.Success)
{
Debug.Log(w.error);
}
else
{
Debug.Log("Finished Uploading Screenshot");
}
}
}
```