使用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. 【随手记-有空整理】Linux随手记

    1. CentOS6.5安装g++:yum install gcc-c++ 注意如果写成yum install g++会提示No package g++ available. 2. XShell下打开 ...

  2. VC生成lib的_stdcall函数名与mingw生成的不一致

    Qt Creator在Windows系统中,怎样链接VC生成的动态链接库 这个问题曾经困扰了我一整天.我想的是按照VC中的方法,增加include文件,增加lib文件,然后编译即可.谁知链接时总是出现 ...

  3. python pythonic是什么?

    原文地址:http://faassen.n--tree.net/blog/view/weblog/2005/08/06/0 注:Martijn 是 Zope 领域的专家,他为 Zope 系列产品做了许 ...

  4. MFC内部结构剖析

    //////////////////////////////////////////////////////////////////////////////////////////MFC程序的执行顺序 ...

  5. Poj 2092 Grandpa is Famous(基数排序)

    题目链接:http://poj.org/problem?id=2092 思路分析:先统计数据,在根据Count降序排序,Count相等时按照Num升序排序:再输出Count第二大的所有Num: 代码如 ...

  6. 从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写

    一.文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 ...

  7. X-UA-Compatible IE 浏览器默认文档模式设置

    制作网页的时候,IE8浏览器浏览页面的时候,有时候文档模式默认是IE7,导致IE8兼容性不是非常好.出现IE7应该出现的模式. 解决的方法例如以下: 在X-UA-Compatible中可用的方法有: ...

  8. iOS之UITableViewCell左右滑动效果

    首先在 UITableViewCell.h 中声明一个代理 @protocol UITableViewCellSlideDelegate <UITableViewDelegate> @op ...

  9. 【JavaScript】强制缓存刷新

    1.在js引用时加入时间戳. <script> document.write('<script src="xxx.js?_dc='+new Date().getTime() ...

  10. CodeForces 486C Palindrome Transformation 贪心+抽象问题本质

    题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...