Unity3d本地上传并且裁剪图片-----pc平台

Unity3d本地上传并且裁剪图片-----pc平台

注:引擎版本unity4.x

最近项目需求,需要做用户头像,要求:

1.  可以从本地上传

2.  本地裁剪

3.  压缩控制大小

4.  在三个平台实现PC/Android/IOS

弄了好几天总是搞完了总结一下

 

按照需求一步一步做

第一步:从本地上传

    从本地上传文件要用到winform库,从unity引擎安装目录下找到System.Windows.Form.dll导入到项目的Plugins目录下。

    通过以下几步实现打开文件夹并选择文件的功能:

//创建窗口对象

  OpenFileDialog ofd = newOpenFileDialog();

 

//操作设置----设置文件格式筛选
  ofd.Filter = "所有文件(*.*)|*.*|png文件|*.png|jpg文件|*.jpg";   

    

//操作设置----起始目录

ofd.InitialDirectory="d:\\";              

   

//打开文件夹目录,选择文件
  DialogResult resurt = ofd.ShowDialog();


  if (resurt == DialogResult.OK)
  {

//ofd.FileName是得到选择文件的地址 OpenFile是对它裁剪的入口
  OpenFile(ofd.FileName);

}

 

 

第二步:本地裁剪

裁剪分为两步,1.确定裁剪范围  2.截图

 

1. 确定裁剪范围

DataPath是文件操作路径

#if UNITY_STANDALONE_WIN

        DataPath = UnityEngine.Application.streamingAssetsPath;

#else

        DataPath =UnityEngine.Application.persistentDataPath;

#endif

 //得到文件路径后开始操作

publicvoid OpenFile(string filename) {

        // HeadTexture 是NGUI纹理对象UITexture

        byte[]texture = File.ReadAllBytes(filename);//读取图片字节流

        File.WriteAllBytes(DataPath+ "/temp.jpg", texture);//保存在项目目录下,这么操作是因为www读取项目目录外的文件报错

        WWWwwwTexture = newWWW("file://" + DataPath + "/temp.jpg");//读取文件

        HeadTexture.mainTexture =wwwTexture.texture;//得到读取的纹理

        int width =wwwTexture.texture.width;

        int height= wwwTexture.texture.height;

        //这里根据具体要求显示,太小的图片放大,太大的缩小

        if (width <= 800&& height <= 800)

        {

            if (height > width)

            {

                HeadTexture.height = 800;

                HeadTexture.width = width * 800/ height;

            }

            else

            {

                HeadTexture.width = 800;

                HeadTexture.height = height *800 / width;

              

            }

        }

        elseif (width <= 1000&& height <= 1000)

        {

            HeadTexture.width = width;

            HeadTexture.height = height;

        }  

        else

        {

            if (height > width)

            {

                HeadTexture.height = 1000;

                HeadTexture.width = width *1000 / height;

            }

            else

            {

                HeadTexture.width = 1000;

                HeadTexture.height = height *1000 / width;

           }

        }

}

在显示纹理的上,用户进行截图操作的功能比较简单,不涉及引擎外的功能,就在这写了

 

2.截图

选取好范围后把这个范围内的内容截屏,这个一定要开启协程,在每帧刷完之后开始截屏

用法:StartCoroutine(DoScreenShot());

IEnumeratorDoScreenShot()

    {

        Rect rect = newRect(left,Top, width, height);

/*

创建Rect对象,在cocos2d里的参数left和Top是截取点距离屏幕左边和顶部的距离,但我这样赋值的时候报错了,后来发现在unity3d里,left和Top就是起始点的坐标x和y,也就是距离左边和下边的距离,width和height是一样的,截取的范围,这里需要注意,这个坐标一定要转换成屏幕坐标,在NGUI是这样转换的

UICamera.currentCamera.WorldToScreenPoint(MaskTop.transform.position)

没用NGUI的话直接用Camera对象转换即可

*/

        //创建截屏纹理

Texture2D screenShot = newTexture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);

        yieldreturnnewWaitForEndOfFrame();

        //截图并保存为纹理

        screenShot.ReadPixels(rect, 0, 0); 

        screenShot.Apply();

        //转换成字节流并保存在本地

        byte[] bytes= screenShot.EncodeToJPG();

        stringfilename = DataPath + "/dlhead.jpg";

        File.WriteAllBytes(filename,bytes);

        //需要显示就用WWW加载显示

        //然后把这个字节流上传到服务器就行啦

    }

 

第三步:文件压缩

开始花了点时间做文件压缩,做好以后发现这个截图下来的文件大小很合适,就没用,而且压缩代码也很长就不这里写啦

 

Android和IOS我会分别写一篇博客的


你可能感兴趣的:(unity3d)