unity的图片处理操作

unity中常常用的图片格式就是texture/texture/sprite了。其中当满足unity解析格式的图片被拖入进去的话,就会自动被解析成了sprite类型的文件了。
平时的扩展常用的导入unity中的就是.png和.jpg格式了,拖入到unity中后会被自动解析成texture格式了,这个就是模型上可以用的贴图格式了,如果想将之改编成UI可用的格式的话,那就是将之转换成了Sprite格式的文件了。

texture和sprite的区别
区别在于:
Sprite 只能用在 Image 组件上.
其他格式使用 Raw Image.
sprite多了一些关于动画的控制.
Sprite可以做九宫.
Sprite一般用在小图.可以打Atlas.只能用默认压缩格式.

Texture可以选择Advance来控制更多选项.比如是否生成MipMaps.选择压缩格式等.可以通过 WWW 显示一张Texture


(1)传统IO操作
①将图片从某位置(如果是从网络,那么就需要socket,如果是本地,直接进行操作,总之就是将图片转换成流的形式进行操作了)加载入unity并且转换成sprite(中间会将图片转换成Texture或者Texture2D的格式)


//读取图片并转换为byte数组
    byte[] ReadPicture()
    {
        FileStream fs = new FileStream("e:/tsj.jpg", FileMode.Open);
        byte[] binary = new byte[fs.Length];
        fs.Read(binary, 0, (int)fs.Length);
        fs.Close();
        fs.Dispose();
        return binary;
    }
//上述得到的数组转换成Sprite
IEnumerator WritePicture()
    {
        Texture2D texture = new Texture2D(1024, 1024);
        texture.LoadImage(ReadPicture());
        Sprite prite = Sprite.Create(texture, new Rect(0, 0, 800, 531), new Vector2(0.5f, 0.5f));
        ima.sprite = prite;
        yield return 0;
        Resources.UnloadUnusedAssets();
    }
②将图片字节数组转换成图片并保存到某目录下。
//上述得到的数组写到资源目录下
   void WritePictureByte(byte [] picByte)
    {
        FileStream fs = new FileStream(Application.dataPath+"/aaa.jpg",FileMode.Create,FileAccess.Write);
        fs.Write(picByte,0,picByte.Length);
        fs.Close();
        fs.Dispose();
    }
③将unity中的Texture保存到某目录下
  private void ImageSaveLocal(Texture tex)
    {
        string path = null;
#if UNITY_
        path=Application.persistentDataPath+"/"+pic_fileName;
#elif UNITY_IPHONE
        path=Application.persistentDataPath+"/"+pic_fileName;
#elif UNITY_EDITOR
        path = Application.dataPath + "/" + "这里写图片名字.jpg";
#endif
        Texture2D saveImageTex = tex as Texture2D;
        FileStream newFs = new FileStream(path, FileMode.Create, FileAccess.Write);
        byte[] bytes = saveImageTex.EncodeToJPG();
        newFs.Write(bytes, 0, bytes.Length);
        newFs.Close();
        newFs.Dispose();
    }
④将Unity中的Sprite保存到某目录下(sprite-texture-字节流)
其实前面已经实现了大部分的功能,还没有实现的功能就是怎么从sprite转换成texture2d

//复杂的转换方法
public Texture2D SpriteToTexture(Sprite sprite)
    {
        Texture2D tex = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height, sprite.texture.format, false);
        tex.SetPixels(sprite.texture.GetPixels((int )sprite.rect.xMin,(int)sprite.rect.yMin,
            (int)sprite.rect.width,(int)sprite.rect.height));
        tex.Apply();
        return tex;
    }

当然也可以直接从要转换的Sprite上点出Texture,比如sprite.texture
目前尚且不知道区别在哪里。

当遇到权限问题的话,在图片的下面有一个Advance的下拉按钮,点击之后有一个Read/Write Enabled选项,勾上之后就可以正常的读写了。

(2)WWW的操作(代码相对简单,但是效率比较低)
用WWW进行加载的时候其实就直接省去了字节流的转换步骤,而直接用www.texture就可以拿到相应的jpg或者png格式的图片来了,而且因为省去了字节操作,Texture2D的创建也不用填入width和height了

    // 以WWW方式进行加载
    private void LoadByWWW()
    {
        StartCoroutine(Load());
    }

    IEnumerator Load()
    {
        double startTime = (double)Time.time;
        //请求WWW
        WWW www = new WWW("file://D:\\test.jpg");
        yield return www;        
        if(www != null && string.IsNullOrEmpty(www.error))
        {
            //获取Texture
            Texture2D texture=www.texture;

            //创建Sprite
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
            image.sprite = sprite;

            startTime = (double)Time.time - startTime;
            Debug.Log("WWW加载用时:" + startTime);
        }
    }

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭