You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:05:24