我正在开发一款监控相机预览的应用程序,并对其进行一些图像处理并在画布上显示int。就像诊断一样,我有以下代码:
camera = Camera.open();
ImageFormat imf = new ImageFormat();
Camera.Parameters param = camera.getParameters();
param.setPreviewSize(128, 128);
preview_format = param.getPreviewFormat();
Camera.Size sz = param.getPreviewSize();
myimage = new int[sz.width*sz.height];
在运行时,它报告preview_format是17,据我所知是“NV21”。
后来我有:
camera.setPreviewCallback(new PreviewCallback()
{
public void onPreviewFrame(byte[] _data, Camera _camera)
{
YUV_NV21_TO_RGB(myimage , _data, 128, 128) ;
}
});
YUV_NV21_TO_RGB函数取自here。
同时在另一个主题中我有:
canvas.drawBitmap(
myimage, // the int array
0, // where to start in the array
128, // the stride ???
200, // x coord of where to display
200, // y coord of where to display
128, // wid
128, // ht
false, // alpha used?
null); // the paint used
可以在下面的方块中的其他诊断中看到生成的图像。当我移动手机时,条纹会发生变化,并且在某种程度上与相机所指向的相对应,但很明显它已被破坏。我尝试使用另一个找到here的函数,另一个来自维基百科,但结果看似相同。有什么想法吗?
编辑:有人认为,或许NV21可能无法完全指定格式 - 可能是一类格式,您需要继续并指定每像素或类似的位数。 / p>
编辑:一个额外的线索 - 如果我完全遮住相机,那么这个方块就会变成纯绿色。
答案 0 :(得分:1)
您的预览尺寸不是128 x 128,因为您无法设置它。您可以在Camera.Parameters
实例上进行设置,但不要将其应用于相机。
您需要添加以下行:
camera.setParameters(param);
直接从Camera
实例获取参数可能是安全的:
preview_format = camera.getPreviewFormat();
Camera.Size sz = camera.getPreviewSize();