takePicture rawCallback返回一个空指针. getPictureFormat只允许.jpg.虽然可以通过getParameters()setJpegQuality(100)setParameters来改进jpeg,但是返回的图像仍然是一个jpeg.要获取位图图像BitmapFactory.decodeByteArray需要调用,这可能需要1/2秒的时间来处理.
我正在工作的应用程序需要相机可以产生的最详细的图像,这不一定意味着漂亮.原始相机芯片捕获格式是拜耳.
解决方法
android(至少我的)有2个相机参数“rawsave-mode”和“rawfname”,默认的rawsave-mode = 0.通过设置rawsave-mode = 1,相机将保存原始相机图像文件,以及照常执行其他相机功能.
Camera.Parameters parameters=preview.camera.getParameters(); parameters.set("rawsave-mode","1"); parameters.set("rawfname","/mnt/sdcard/test.raw"); preview.camera.setParameters(parameters); preview.camera.takePicture(shutterCallback,null,jpegCallback);
生成的文件的实际名称被修改为包括正在生成的原始文件的参数.对于我的一个机器人,产生的名称是“test__1604x1206_10_2.raw”,它是a1 1604×1206图像,10bit格式2.和“test__1284x966_10_3.raw”,它是1284×966图像,10位格式3. 10个字节存储为2个字节短int(小端).
parameters.set("rawsave-mode","2"); // setting the rawsave-mode to 2 increased the resolution to 3204x2406 // and output the file test__3204x2406_10_2.raw
图像数据大约为8位,但在10位内浮动,其中较亮的图像可能使用较高的值,并且较暗.这允许图像处理软件创建直方图并捕获图像的有用范围.因为光不是恒定的,所以也可能需要调整一个通道与另一个通道不同,以使图像看起来颜色正确.网络上有很多关于颜色理论的信息,可以充分解释这一点,但是新用户需要注意的是,10位到8位的转换速度很快.如果你想要一个漂亮的图片,使用Android图片捕获,而不是原始图像!
格式表示位的拜耳模式.拜耳是一种格式,其中行和列的奇数/偶数值表示像素表示哪种颜色,其中RGB对于每个像素的每个颜色通道具有8位值,拜耳对像素只有一个10位值,其中一个像素是红色,然后是下一个绿色,红色,绿色,绿色.那么下一行就有蓝色,蓝色,蓝绿色.要确定像素的RGB值需要解释周围的像素.
Format 2 has pixel order // 0 1 2 3 4 5 // 0 G R G R G R // 1 B G B G B G // 2 G R G R G R // 3 B G B G B G
格式3具有像素顺序
// 0 1 2 3 4 5 // 0 R G R G R G // 1 G B G B G B // 2 R G R G R G // 3 G B G B G B
我不知道这种技术是否适用于其他机器人,或者它将在未来的机器人上工作.如果有人尝试这个,请添加一个关于成功或失败的评论.我的手机是直接中国进口解锁iHTC Android手机已经扎根.