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

注:引擎版本unity4.x

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

1.  可以从本地上传

2.  本地裁剪

3.  压缩控制大小

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

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

从本地上传会用到Android系统功能,打开相册和用摄像机拍照,因此unity和Android的交互是必须要会的。

Unity-android可参考到宣雨松的博客http://www.xuanyusong.com/archives/676package com.cheerflame.sdrn;

我参考过一些博文之后整理了一个图片处理类,直接导入这个类调用它的方法就可以了

用法(3步):

1.//在MainActivity中创建图片处理对象

ImgManage = new HeadImgManage(this);

2.//在unity中调用此接口,在接口中调用图片处理类的TakePhoto方法,当choose = 0 的时候打开相机拍照,choose=1的时候打开相册

public void TakePhoto(int choose){

ImgManage.TakePhoto(choose);

}

3.//在MainActivity中接收事件请求回调

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    	Log.i("TEST", "requestCode = " + requestCode);
	        if (resultCode == NONE){
	        	Log.i("TEST", "resultCode == NONE ");
	         	return;
	        }

	        if (requestCode == PHOTOHRAPH) {
	        	Log.i("TEST", "拍照完成");
	            File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg");
	            ImgManage.startPhotoZoom(Uri.fromFile(picture));
	        }  

	        if (data == null)
	        {
	        	Log.i("TEST", "data == null");
	        	return;
	        }

	        // 读取相册缩放图片
	        if (requestCode == PHOTOZOOM) {
	        	Log.i("TEST", "读取相册完成");
	        	ImgManage.startPhotoZoom(data.getData());
	        }
	        // 处理结果
	        if (requestCode == PHOTORESOULT) {
	            Bundle extras = data.getExtras();
	            if (extras != null)
	            {
		            Bitmap photo = extras.getParcelable("data");
		            try {
		            	ImgManage.SaveBitmap(photo);
		            }
		            catch (IOException e)
		            {
		            	// TODO Auto-generated catch block
		            	e.printStackTrace();
		            }
	            }
	        }
	        super.onActivityResult(requestCode, resultCode, data);
	    }  

处理类:

package com.cheerflame.sdrn;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

public class HeadImgManage{
	UnityPlayerActivity unityActivity;

	public static final int NONE = 0;
    public static final int PHOTOHRAPH = 1;// 拍照
    public static final int PHOTOZOOM = 2; // 缩放
    public static final int PHOTORESOULT = 3;// 结果
    public static final String IMAGE_UNSPECIFIED = "image/*";  

    public final static String FILE_NAME = "image.jpg";
    public final static String DATA_URL = "/data/data/";

    public HeadImgManage(UnityPlayerActivity activity){
		unityActivity = activity;
	}

    public void TakePhoto(int choose)
    {
    	if(choose == 0)
        {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));
            unityActivity.startActivityForResult(intent, PHOTOHRAPH);
        }
    	else
        {
            Intent intent = new Intent(Intent.ACTION_PICK, null);
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
            unityActivity.startActivityForResult(intent, PHOTOZOOM);
        }
    }

    public void startPhotoZoom(Uri uri) {
    	Log.i("TEST", "开始裁剪" + uri);

        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);
        intent.putExtra("return-data", true);
        unityActivity.startActivityForResult(intent, PHOTORESOULT);
    }  

    public void SaveBitmap(Bitmap bitmap) throws IOException {
    	Log.i("TEST", "保存文件");
                FileOutputStream fOut = null;

                //注解
                String path = "/mnt/sdcard/Android/data/com.cheerflame.sdrn/files";
                try {
                          //查看这个路径是否存在,
                          //如果并没有这个路径,
                          //创建这个路径
                          File destDir = new File(path);
                          if (!destDir.exists())
                          {
                                  destDir.mkdirs();
                          }

                        fOut = new FileOutputStream(path + "/" + FILE_NAME) ;
                        Log.i("TEST", "保存路径:" + path + "/" + FILE_NAME);
                        UnityPlayer.UnitySendMessage("Camera", "HeadImage","success!");
                        Log.i("TEST", "success");
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                }
                //将Bitmap对象写入本地路径中,Unity在去相同的路径来读取这个文件
                bitmap.compress(Bitmap.CompressFormat.JPEG, 10, fOut);
                try {
                        fOut.flush();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                try {
                        fOut.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

}

"/mnt/sdcard/Android/data/com.xxxx.xxx/files"目录和unity中UnityEngine.Application.persistentDataPath获得路径是一样的,也就是沙盒文件,对沙盒文件操作网上介绍蛮多,我这里就不多说了

bitmap.compress(Bitmap.CompressFormat.JPEG, 10, fOut);这个参数10,是0-100选取图片质量的函数,一般从相册截取完图片之后,图片大小大约是30-40k,显然太大了,10的话大约压缩到原来的1/10,也就是3-4k就很小了

ios的博客之后添加

时间: 2024-08-27 21:48:38

Unity3d本地上传并且裁剪图片-----Android平台的相关文章

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

注:引擎版本unity4.x 最近项目需求,需要做用户头像,要求: 1.  可以从本地上传 2.  本地裁剪 3.  压缩控制大小 4.  在三个平台实现PC/Android/IOS 弄了好几天总是搞完了总结一下 在网上找了一段时间,有人推荐了一个插件,网盘地址忘记存了,直接上代码吧 OpenPhotoController.h : @interface OpenPhotoController : NSObject<UIApplicationDelegate,UIImagePickerContro

MVC使用JCrop上传、裁剪图片

JCrop用来裁剪图片,本篇想体验的是: 在视图页上传图片: 上传成功,跳转到另外一个编辑视图页,使用JCrop对该图片裁剪,并保存图片到指定文件夹: 裁剪成功后,在主视图页显示裁剪图片: 当然,实际项目中最有可能的做法是:在本页上传.裁剪并保存. □ 思路 →在上传图片视图页,把图片上传保存到一个临时文件夹Upload→在编辑裁剪视图页,点击"裁剪"按钮,把JCrop能提供的参数,比如宽度.高度.离顶部距离,离底部距离,离左右端距离等封装成类,传递给控制器方法→控制器方法根据接收到的

图片本地上传预览

在IE里面显示的话,你可以用div直接显示图片,不通过img来添加SRC,这样就不会有小图标出现 例子: <div class="banner_up_pic" id="imgPreDiv"></div> var file_upl = document.getElementById("file"); file_upl.select(); 获取图片路径  var imgpath=document.selection.creat

SpringMVC上传文件(图片)并保存到本地

SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize">

Dedecms本地上传缩略图无法自动添加水印的解决方法

客户遇到一个问题,DEDECMS(V5.7)后台添加文档时,本地上传缩略图无法自动添加水印(系统设置里的图片水印设置没有问题),找了半天,终于找到了解决方法,留个记号: 打开dede/archives_do.php 找到第111行 $upfile = AdminUpload('litpic', 'imagelit', 0, false ); 改成 $upfile = AdminUpload('litpic', 'imagelit', 0, true ); 然后打开include/helpers/

input type=&#39;file&#39; 上传文件 判断图片的大小是否合格与witdh 和 height 是否合格

function CheckFiles(obj) { var array = new Array('gif', 'jpeg', 'png', 'jpg'); //可以上传的文件类型 if (obj.value == '') { alert("让选择要上传的图片!"); return false; } else { var fileContentType = obj.value.match(/^(.*)(\.)(.{1,8})$/)[3]; //这个文件类型正则很有用:) var isE

上传头像裁剪功能

我之前做项目的时候有需求是需要实现上传头像裁剪再上传到服务器,所以上网看了一下别人写的案例.方法.文章,浪费了1天的时间,最后才跌跌碰碰的终于写了出来. 现在给大家分享一下吧. 所用到的js文件 cropper.min.js, canvas-to-blob.js(这个是IE上需要用到的,不然会不支持转blob) jquery.min.js, bootstrap.min.js ajaxfileupload.js css文件 cropper.min.css,bootstrap.min.css htm

从本地上传到hdfs上出现异常

hdfs dfs -put  从本地上传到hdfs上出现异常 与namenode  同台机器的datanode错误日志信息如下: 2015-12-03 09:54:03,083 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Slow BlockReceiver write data to disk cost:727ms (threshold=300ms) 2015-12-03 09:54:03,991 INFO org.apache.

本地上传文件到服务器,从服务器下载文件到本地

最近在做项目的时候涉及到了文件的上传.下载,以前学习IO时也没有搞得多清楚,在网上找了些上传下载的例子,然后修改了部分.经测试,上传下载文件暂时能用,下面是上传和下载的方法: 1.本地上传文件到服务器 html代码: <form id="uploadDatumInfo" name="uploadDatumInfo" method="post" enctype="multipart/form-data" target=&q