使用2dx调用android拍照功能,拍照结束后在2dx界面显示拍照照片,如果不对照片做处理,会出现内存过大的问题,导致程序崩溃,如果仅仅另存拍照照片,则照片质量大小均下降,导致照片不够清晰,后来发现只需要修改照片尺寸大小就可以解决,而且质量没有太多改变,照片清晰足够。

调用拍照功能

	public static void onClickTakePhoto() {

		String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
main.startActivityForResult(intent, PHOTO_GRAPH);
} else {
Toast.makeText(main, "摄像头不存在", Toast.LENGTH_SHORT).show();
}
}

拍照之后回调函数

	@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Uri uri = data.getData();
// Bitmap photo = null;
// if (uri != null) {
// photo = BitmapFactory.decodeFile(uri.getPath());
// }
// if (photo == null) {
// Bundle bundle = data.getExtras();
// if (bundle != null) {
// photo = (Bitmap) bundle.get("data");
// } else {
// return;
// }
// }
// try {
// SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
// Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
// String str = formatter.format(curDate);
// System.out.println("++++++++++++" + str);// &&str=="08:00"
// saveMyBitmap(photo, str);
// } catch (IOException e) {
// e.printStackTrace();
// } if (requestCode == PHOTO_GRAPH) {// photo take
if (data != null) {// 防止用户直接后退
String imgpath = null; Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 Uri uri = data.getData();
if (uri == null)
uri = Uri.parse(MediaStore.Images.Media.insertImage(
getContentResolver(), bitmap, null, null));
// 方法1
Cursor cursor = this.getContentResolver().query(uri, null,
null, null, null);
cursor.moveToFirst();
imgpath = cursor.getString(cursor.getColumnIndex("_data"));// 获取绝对路径
cursor.close(); try {
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyyMMddHHmmss");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = formatter.format(curDate);
System.out.println("++++++++++++" + str);// &&str=="08:00"
saveMyBitmap(bitmap, str, imgpath);//另存照片
} catch (IOException e) {
e.printStackTrace();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}

saveMyBitmap 可以根据获得的bitmap另存照片,也可以根据获得的照片路径另存照片,

我这里用的是路径另存照片,用bitmap另存照片之后发现照片质量下降,尽管不进行压缩也有这个问题

	// 保存照片
public static int saveMyBitmap(Bitmap bitmap, String bitName, String imgpath)
throws IOException {
String PhotoPath = null;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 得到sdCard文件对象
File sdDir = Environment.getExternalStorageDirectory();
// 得到sdCard的路径
String path = sdDir.getAbsolutePath() + "/bxJiang/temp";
File path1 = new File(path);
if (!path1.exists()) {// 若不存在,创建目录,可以在应用启动的时候创建
path1.mkdirs();
System.out.println("sd file path create:" + path);
}
PhotoPath = path + "/" + bitName + ".jpg";// "/mnt/sdcard/bxJiang/head_tmp.jpg"
System.out.println(PhotoPath); ByteArrayOutputStream baos = new ByteArrayOutputStream();
Bitmap bitmap2 = getimage(imgpath);//根据照片路径修改另存照片尺寸大小,质量改变很小
bitmap2.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
System.out.println(b.length / 1024);
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(new File(
PhotoPath)));
bos.write(b, 0, b.length);
bos.close();
System.out.println("图片创建成功");
} catch (Exception e) {
e.printStackTrace();
}
// ========================
// File f = new File(PhotoPath);
// f.createNewFile();
// FileOutputStream fOut = null;
// try {
// fOut = new FileOutputStream(f);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// return 0;
// }
// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
// try {
// fOut.flush();
// } catch (IOException e) {
// e.printStackTrace();
// return 0;
// }
// try {
// fOut.close();
// } catch (IOException e) {
// e.printStackTrace();
// return 0;
// }
} else {
System.out.println("no sd card");
return 0;
}
// 发送文件路径到c++
SendPhotoPathToC(PhotoPath, PhotoPath);// imgpath);
return 1;
} //根据照片路径修改另存照片尺寸大小,质量改变很小
private static Bitmap getimage(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空 newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
System.out.println(w);
System.out.println(h);
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
int ww = m_Wight;// 这里设置宽度为480f
int hh = m_Height;// 这里设置高度为800f
System.out.println(ww);
System.out.println(hh);
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (w / ww);
} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
be = (int) (h / hh);
}
if (be <= 0)
be = 1;
System.out.println(be);
newOpts.inSampleSize = be;// 设置缩放比例,照片高度和宽度都为原来的be分之一,即照片为原来的2*be分之一
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
return BitmapFactory.decodeFile(srcPath, newOpts);
} //根据bitmap修改另存照片尺寸大小,没有调用,存在一些问题
private static Bitmap comp(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
System.out.println(w);
System.out.println(h);
float hh = m_Height;// 这里设置高度为800f
float ww = m_Wight;// 这里设置宽度为480f
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (w / ww);
} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
be = (int) (h / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;// 设置缩放比例
return BitmapFactory.decodeStream(isBm, null, newOpts);
}

下面贴一下我的手机获得的参数

w = 1552 , h = 2592   //拍照照片的尺寸,大小为758KB

ww = 480 , hh = 800    //手机分辨率

be = 3

最终照片参数

776*1296  742KB

有个问题不太明白,为什么照片大小一样的情况下,尺寸过大的照片加载显示会内存过大挂掉,而尺寸小的却不会?

Cocos2d-x使用android拍照功能加载照片内存过大,通过另存照片尺寸大小解决的更多相关文章

  1. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  2. Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  3. Android图片异步加载之Android-Universal-Image-Loader(转)

    今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...

  4. [置顶] Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  5. Android 高清加载巨图方案 拒绝压缩图片

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...

  6. android加载大量图片内存溢出的三种方法

    android加载大量图片内存溢出的三种解决办法 方法一:  在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @para ...

  7. Android 图片异步加载的体会,SoftReference已经不再适用

      在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>>  这样软引用的 ...

  8. Android自定义图片加载框架

    大神原网址: http://blog.csdn.net/lmj623565791/article/details/41874561  思路: 1. 压缩图片 压缩本地图片: 获得imageview想要 ...

  9. 实现Android ListView 自动加载更多内容

    研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...

随机推荐

  1. JavaScript基础知识----基本语法

    JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. 分号 ; 分号用于分隔 JavaScript 语句. 通常我们在每条可执行的语句结尾添加分号 ...

  2. html基本框架

  3. POJ 1472 Coins (多重背包+滚动数组)

    Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 25827 Accepted: 8741 Description Pe ...

  4. paip.tree 生成目录树到txt后的折叠查看

    paip.tree 生成目录树到txt后的折叠查看 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.ne ...

  5. [Android学习笔记5]四大应用组件之一:Service 下

    绑定方式的Service使用 在实现绑定服务时,最重要的是定义onBind()回调方法返回的接口,有三种方式: 1. 继承Binder类 2. 使用Messenger 3. 使用AIDL 这里对1,2 ...

  6. 整合SSH三大框架用注解时报An AnnotationConfiguration instance is required to use

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 's ...

  7. c++子类和父类成员函数重名

    子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数. 子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名 ...

  8. BZOJ 2134: 单选错位( 期望 )

    第i个填到第i+1个的期望得分显然是1/max(a[i],a[i+1]).根据期望的线性性, 我们只需将每个选项的期望值累加即可. ---------------------------------- ...

  9. 转: AlphaImageLoader简介

    Microsoft.AlphaImageLoader是IE滤镜的一种,其主要作用就是对图片进行透明处理.虽然FireFox和IE7以上的IE浏览器已经支持透明的PNG图片,但是就IE5-IE6而言还是 ...

  10. Socket网络编程--FTP客户端(60篇socket博客,而且都比较简单、深入浅出)

    已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解FTP作用 就是一个提供一个文件的共享协议. 1.了解FTP协议 ...