简介
本文整理一下Unity进行截图的处理方式及获取屏幕宽高的使用方式,同时还添加了在Editor中如何得到对屏幕的截图处理,并没有特别深入的技术点,有需要的可以参考一下
声明
本文中的内容属于个人总结整理而来,个人水平有限,对于部分细节难免有理解错误及遗漏之处,如果您在阅读过程中有所发现,希望您能指正,同时文章中的部分内容也参考了其它大神的文章,如果文章中的内容侵犯了您的权益,表示非常歉意,请您指出,我将尽快修改。
如果您进行转载,请标明出处。
Unity技术 Unity中屏幕截图实现(http://www.liyubin.com/articles/2020/11/16/1605517934456.html)
获取屏幕宽高
Unity中的Screen类提供了获取屏幕宽高的API,为分别:
-
Screen.Width/Height
获取到的是播放器窗口的宽度与高度
如果在全屏模式下等于Screen.currentResolution.width/height获取到的结果
如果处于Editor模式下结果是Game窗口的宽度与高度
-
Screen.currentResolution.width/height
获取到的是桌面分辨率的宽度与高度
如果在PC下有多屏幕下获取到的是主屏幕的宽度与高度
ScreenCapture的使用
Unity中的ScreenCapture
-
截图存储到指定的文件中
public static void CaptureScreenshot(string filename, int superSize); superSize表示截图放大比例,例如:superSize设置为2,得到的截图为播放器窗口宽度和高度的2倍
-
截图输出到Texture中
public static Texture2D CaptureScreenshotAsTexture(int superSize); superSize表示截图放大比例,例如:superSize设置为2,得到的截图为播放器窗口宽度和高度的2倍
-
截图存储到RT中
public static void CaptureScreenshotIntoRenderTexture(RenderTexture renderTexture);
PS:上述所有的截图均是对播放器窗口的截图,如果是在Editor中结果是对Game窗口的截图
Editor下对桌面进行截图
某些时候有可能需要在Editor中针对桌面进行截图的处理,Unity的Editor内部也提供了对应的API
Color[] pixels = UnityEditorInternal.InternalEditorUtility.ReadScreenPixel(position, width, height);
具体的使用方式如下图:
public static Texture GrabScreenSwatch(Rect rect)
{
int width = (int)rect.width;
int height = (int)rect.height;
int x = (int)rect.x;
int y = (int)rect.y;
Vector2 position = new Vector2(x, y);
Color[] pixels = UnityEditorInternal.InternalEditorUtility.ReadScreenPixel(position, width, height);
Texture2D texture = new Texture2D(width, height);
texture.SetPixels(pixels);
texture.Apply();
return texture;
}
使用方式:
Texture texture = GrabScreenSwatch(new Rect(0,0,Screen.currentResolution.width,Screen.currentResolution.height));
Texture2D生成图片文件
Unity的UnityEngine.ImageConversion类中对Texture2D进行了扩展,添加了可以生成图片的接口。
public static byte[] EncodeToEXR(this Texture2D tex, Texture2D.EXRFlags flags);
public static byte[] EncodeToEXR(this Texture2D tex);
public static byte[] EncodeToJPG(this Texture2D tex, int quality);
public static byte[] EncodeToPNG(this Texture2D tex);
public static byte[] EncodeToTGA(this Texture2D tex);
public static bool LoadImage(this Texture2D tex, byte[] data, bool markNonReadable);
public static bool LoadImage(this Texture2D tex, byte[] data);
额外的提示
对于上述描述中的方式,最好自己真实的测试一下,看看各个接口处理方式上的不同