Cocos2d-x使用android拍照功能加载照片内存过大,通过另存照片尺寸大小解决
使用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拍照功能加载照片内存过大,通过另存照片尺寸大小解决的更多相关文章
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载之Android-Universal-Image-Loader(转)
今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...
- [置顶] Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...
- android加载大量图片内存溢出的三种方法
android加载大量图片内存溢出的三种解决办法 方法一: 在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @para ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
- Android自定义图片加载框架
大神原网址: http://blog.csdn.net/lmj623565791/article/details/41874561 思路: 1. 压缩图片 压缩本地图片: 获得imageview想要 ...
- 实现Android ListView 自动加载更多内容
研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...
随机推荐
- Linux网卡设置
http://blog.chinaunix.net/uid-20149676-id-1733254.html
- js左侧三级菜单导航代码
效果演示: 实例代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- css网页自适应-2
昨天中午Google进行了一次在线讲座,讲述自适应网页设计的概念和方法,维护同一个网页代码,即可使网站在多种浏览设备(从桌面电脑显示器到智能手机或其他移动产品设备)上具有更好的阅读体验,这里我将该讲座 ...
- Kali Linux 安全渗透教程<第三更>1.2 安全渗透所需工具
了解了渗透測试的概念后.接下来就要学习进行渗透測试所使用的各种工具.在做渗透測试之前.须要先了解渗透所需的工具.渗透測试所需的工具如表1-1所看到的: 表1-1 渗透所需工具 splint unhi ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- 一个例子:HelloWorld
作为C语言来说,我是用的是QT Creator作为开发工具. 事实上使用什么工具无所谓.重要的是学到实用的知识. 第一个实例程序就是HelloWorld程序.上代码: 版权声明:您好,转载请离开我的博 ...
- ThinkPHP - 前置操作+后置操作
前置操作和后置操作 系统会检测当前操作(不仅仅是index操作,其他操作一样可以使用)是否具有前置和后置操作,如果存在就会按照顺序执行,前置和后置操作的方法名是在要执行的方法前面加 _before ...
- iOS导航条渐变透明
来源:HelloYeah 链接:http://www.jianshu.com/p/b8b70afeda81 下面这个界面有没有觉得很眼熟.打开你手里的App仔细观察,你会发现很多都有实现这个功能.比如 ...
- 修改字符串 ToCharArray()
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Group DataList
一,效果图. 二,源代码. <!DOCTYPE html><html><head> <meta charset="UTF-8"> & ...