我正在使用一个简单的相机应用程序,并获取实时相机预览到surfaceView
. 我使用按钮打开/关闭相机。在按钮中onClick
,在我调用之后camera.startPreview()
,我运行:
camera.setPreviewCallback(new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
sumRED = 0;
sumGREEN = 0;
sumBLUE = 0;
int frameHeight = camera.getParameters().getPictureSize().height;
int frameWidth = camera.getParameters().getPictureSize().width;
int[] myPixels = convertYUV420_NV21toRGB8888(data, 200, 200);
Bitmap bm = Bitmap.createBitmap(myPixels, 200, 200, Bitmap.Config.ARGB_8888);
imageView.setImageBitmap(bm);
for (int i = 0; i < myPixels.length; i++) {
sumRED = sumRED + Color.red(myPixels[i]);
sumGREEN = sumGREEN + Color.green(myPixels[i]);
sumBLUE = sumBLUE + Color.blue(myPixels[i]);
}
sumRED = sumRED / myPixels.length;
sumGREEN = sumGREEN / myPixels.length;
sumBLUE = sumBLUE / myPixels.length;
String sRed = Float.toString(sumRED);
String sGreen = Float.toString(sumGREEN);
String sBlue = Float.toString(sumBLUE);
rTextView.setText("RED: " + sRed);
gTextView.setText("Green: " + sGreen);
bTextView.setText("Blue: " + sBlue);
}
}
我正在使用从这里提供的 NV21 到 RGB 转换的代码。
我认为通过Color.blue(myPixels[i]);
对 RGB 颜色进行处理,我将获得每个像素的颜色强度,然后获得图片的平均颜色强度。
但我注意到TextView
红色和绿色显示为完全相同的值。
我重用的代码是否不适合这个目的?或者是否有更好、首选、更有效的方法来获得像素的特定颜色强度(或实时视频预览?)
谢谢
更新:
起初我没有触及预览的输出格式。重建位图的预览非常糟糕。当我添加cameraParam.setPreviewFormat(ImageFormat.YV12);
重建的位图时,将重建的图像划分为 4 个象限。当我用手指盖住相机时(由于闪光灯打开而显示为橙色/红色),重建的图像在顶部两个象限为紫色,在底部两个象限呈绿色。当我将格式更改为 时NV21
,重建的图像是单个图像,并且显示的预览几乎相同,并且所有 RGB 颜色之间都有显着的变化。所以,我的问题是:为什么我得到的结果在 150-160 的范围内,而大部分屏幕是单色的,而值在 255 左右的范围内?我以为我使用的转换算法正在转换为 255 的比例。我在这里缺少什么?