问题描述
我试图把使用Android相机拍摄照片。我有一个要求,捕捉1600(宽)×1200(H)图像(第三方供应商的要求)。我的code似乎很好地工作了很多手机摄像头,但setPictureSize导致某些手机(三星Galaxy S4,三星Galaxy Note)崩溃,并导致对他人条纹图像(Nexus 7平板电脑)。上至少Nexus的我想要的大小上显示的是getSupportPictureSizes列表
我已经试过指定的方向,但它并没有帮助。以使用默认的图片尺寸画面正常工作。
下面是条纹的示例:
有关我的形象捕获我的1600×1200,JPG,30%的玉米pression的要求,所以我拍摄JPG文件。
我觉得我有三种选择:
1)弄清楚如何捕捉1600×1200尺寸没有崩溃或条纹,或
2)找出如何将默认图片尺寸的大小更改为JPG是1600×1200。
3)别的东西,目前还不清楚我的。
我发现有类似的问题,但不完全一样的其他一些帖子。我在我的努力的事情第二天,但我没有找到一个解决方案。这里有一个发帖称亲近:
Camera图片在搞砸图片位图的结果(无的建议,帮助我)
下面是我的code的,对于直到我跑进S4 /注工作的罚款节/ 7的Nexus我已经平添了几分调试code的现在:
Camera.Parameters参数= mCamera.getParameters();
Camera.Size大小= getBest previewSize(宽度,高度,参数);如果(大小!= NULL){
INT pictureWidth = 1600;
INT pictureHeight = 1200; //测试
Camera.Size测试= parameters.getPictureSize();
清单< Camera.Size> testSizes = parameters.getSupportedPictureSizes();
的for(int i = 0; I< testSizes.size();我++){
测试= testSizes.get(ⅰ);
} 测试= testSizes.get(3);
//得到(3)是1600×1200
pictureWidth = test.width;
pictureHeight = test.height; parameters.setPictureFormat(ImageFormat.JPEG);
parameters.setPictureSize(pictureWidth,pictureHeight);
parameters.setJpegQuality(30);
parameters.set previewSize(size.width,size.height); //捕捉任何异常
尝试{
//确保preVIEW停止
mCamera.stop preVIEW(); mCamera.setParameters(参数);
didConfig =真;
赶上(例外五){
//一些错误presentation是为简洁,删除
//因为didConfig未设置为true,将正常失败
}
}
下面是我的code的,节省了JPG文件的部分:
PictureCallback jpegCallback =新PictureCallback(){
公共无效onPictureTaken(字节[]数据,相机摄像头){
如果(data.length大于0){ 字符串文件名=image.jpg的; 档案文件=新的文件(getFilesDir(),文件名);
串文件路径= file.getAbsolutePath(); 布尔goodWrite = FALSE;
尝试{
OutputStream的OS =新的FileOutputStream(文件);
os.write(数据);
os.close(); goodWrite = TRUE;
}赶上(IOException异常五){
goodWrite = FALSE;
} 如果(goodWrite){
//去到preVIEW
}其他{
// TODO错误返回到调用活动
} } Log.d(TAGonPictureTaken - JPEG);
}
};
如何正确设置相机参数,拍照或如何裁剪或调整所产生的照片将是巨大的任何建议。尤其是如果它会与旧相机(API级别8或更高版本)工作!根据需要在图像I只能剪切掉顶部的整个宽度。
谢谢!
编辑:这是我落得这样做:
我开始通过处理Camera.Parameters getSupportedPictureSizes使用的第一个具有的高度和宽度都大于我的期望的尺寸,和相同的宽度:高度比率。我设置相机参数到图片的大小。
然后,一旦图片拍摄:
BitmapFactory.Options选项=新BitmapFactory.Options();;
options.inPurgeable = TRUE;//字节数组转换为位图,注意让垃圾收集
位图原= BitmapFactory.de codeByteArray的(输入,0,input.length,期权);
//调整位图到我期望的规模
位图大小= Bitmap.createScaledBitmap(原件,1600,1200,真正的);//创建一个新的字节数组输出位图到COM pressed JPG
ByteArrayOutputStream BLOB =新ByteArrayOutputStream();
resized.com preSS(Bitmap.Com pressFormat.JPEG,30,BLOB);//回收内存,因为位图似乎有稍微不同的垃圾回收
original.recycle();
resized.recycle();字节[] =所需blob.toByteArray();
然后,我写出来的预期JPG至要上传的文件。
检测= testSizes.get(3);
//得到(3)是1600×1200
有没有要求阵列有4+元素,更不用说第四个元素是1600×1200。
There is no guarantee that every device is capable of taking a picture with that exact resolution. You cannot specify arbitrary values for the resolution -- it must be one of the supported picture sizes. Some devices support arbitrary values, while other devices will give you corrupted output (as is the case here) or will flat-out crash.
I am not aware that there is a "default picture size", and, beyond that, such a size will be immutable, since it is the default. Changing the picture size is your option #1 above.
For devices that support a resolution that is bigger on both axes, take a picture in that resolution, then crop to 1600x1200.
For all other devices, where one or both axes are smaller than desired, take a picture in whatever resolution suits you (largest, closest match to 4:3 aspect ratio, etc.), and then stretch/crop to get to 1600x1200.
这篇关于Android相机参数setPictureSize导致条纹图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!