Unity中旋转Sprite并保存的方法:手机截图转Sprite后需旋转90度
解决Sprite旋转90度后保存的问题
因为Sprite本质是基于Texture2D的切片数据,Transform.rotation只是改变物体的显示角度,不会修改纹理本身。要保存旋转后的图片,需要先旋转原始Texture2D,再生成Sprite或直接保存修改后的纹理。
方法一:旋转Texture2D后生成Sprite(适合需要保存旋转后图片的场景)
添加一个旋转Texture2D的工具方法,先将读取到的纹理旋转90度,再用旋转后的纹理创建Sprite。示例代码如下:
byte[] bytes2 = System.IO.File.ReadAllBytes(photoname); Debug.Log(bytes2 + "bytes "); Texture2D texture = new Texture2D(1, 1, TextureFormat.ARGB32, false); texture.filterMode = FilterMode.Bilinear; texture.LoadImage(bytes2); // 将纹理顺时针旋转90度 Texture2D rotatedTexture = RotateTexture(texture, true); // 用旋转后的纹理创建Sprite Sprite sprite = Sprite.Create(rotatedTexture, new Rect(0, 0, rotatedTexture.width, rotatedTexture.height), new Vector2(0.5f, 0.5f)); // 若需保存旋转后的图片,直接输出rotatedTexture的字节数据 byte[] rotatedBytes = rotatedTexture.EncodeToPNG(); System.IO.File.WriteAllBytes(Application.persistentDataPath + "/rotated_screenshot.png", rotatedBytes); // 自定义Texture2D旋转方法 private Texture2D RotateTexture(Texture2D originalTexture, bool clockwise) { int width = originalTexture.width; int height = originalTexture.height; Texture2D rotatedTexture = new Texture2D(height, width, originalTexture.format, false); Color[] originalPixels = originalTexture.GetPixels(); Color[] rotatedPixels = new Color[originalPixels.Length]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int originalIndex = y * width + x; // 计算旋转后像素的索引,clockwise为true时顺时针转90度,反之逆时针 int rotatedIndex = clockwise ? (width - x - 1) * height + y : x * height + (height - y - 1); rotatedPixels[rotatedIndex] = originalPixels[originalIndex]; } } rotatedTexture.SetPixels(rotatedPixels); rotatedTexture.Apply(); return rotatedTexture; }
方法二:仅在显示时旋转Sprite(无需修改纹理)
如果只是需要在场景中呈现旋转后的视觉效果,不需要改变原始纹理数据,可以直接给Sprite所在的组件设置旋转角度:
// 针对SpriteRenderer组件(2D场景物体) SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>(); spriteRenderer.sprite = sprite; // 顺时针旋转90度(Unity 2D旋转由z轴欧拉角控制) spriteRenderer.transform.rotation = Quaternion.Euler(0, 0, -90); // 针对UI的Image组件 Image image = GetComponent<Image>(); image.sprite = sprite; image.rectTransform.rotation = Quaternion.Euler(0, 0, -90);
注意:此方法仅改变物体显示姿态,纹理数据仍为原始状态,保存图片时不会带有旋转效果。
内容的提问来源于stack exchange,提问作者yuuun
相关产品推荐
相关产品推荐

