我有相当可怕的表现时,试图获得像素的相机预览。
图像格式约为600x900。
在我的htc上,预览速度是相当稳定的每秒30帧。
一旦我试图得到图像的像素,帧率下降到5以下!

public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
    Bitmap bmp = mTextureView.getBitmap();
    int width = bmp.getWidth();
    int height = bmp.getHeight();
    int[] pixels = new int[bmp.getHeight() * bmp.getWidth()];
    bmp.getPixels(pixels, 0, width, 0, 0, width, height);
}

表演太慢了,实在受不了。
现在我唯一的“简单”解决方案是跳过帧以至少保持一些视觉性能。
但实际上我想让代码执行得更快。
如果有什么想法和建议我会很感激,也许有人已经解决了这个问题?
更新
getbitmap: 188.341ms
array: 122ms
getPixels: 12.330ms
recycle: 152ms

只需要190毫秒就可以得到位图!!这就是问题所在

最佳答案

我研究了几个小时。
简而言之:我没有办法避免getBitmap()并提高性能。
这个函数是已知的慢,我发现许多类似的问题,没有结果。
不过,我找到了另一个解决方案,它的速度大约是我的3倍,为我解决了这个问题。
我一直使用textureview方法,我之所以使用它,是因为它在如何显示相机预览上提供了更多的自由(例如,我可以在自己的纵横比的小窗口中显示相机实时预览,而不会出现失真)
但是为了处理图像数据,我不再使用onsureFaceTextureUpdated()了。
我注册了一个camerapreviewframe的回调,它提供了我需要的像素数据。
所以不再使用getBitmap,而且速度更快。
快速,新代码:

myCamera.setPreviewCallback(preview);

Camera.PreviewCallback preview = new Camera.PreviewCallback()
{
    public void onPreviewFrame(byte[] data, Camera camera)
    {
        Camera.Parameters parameters = camera.getParameters();
        Camera.Size size = parameters.getPreviewSize();
        Image img = new Image(size.width, size.height, "Y800");
    }
};

慢:
private int[] surface_pixels=null;
private int surface_width=0;
private int surface_height=0;
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture)
{
    int width,height;

    Bitmap bmp= mTextureView.getBitmap();
    height=barcodeBmp.getHeight();
    width=barcodeBmp.getWidth();
    if (surface_pixels == null)
    {
        surface_pixels = new int[height * width];
    } else
    {
        if ((width != surface_width) || (height != surface_height))
        {
            surface_pixels = null;
            surface_pixels = new int[height * width];
        }
    }
    if ((width != surface_width) || (height != surface_height))
    {
        surface_height = barcodeBmp.getHeight();
        surface_width = barcodeBmp.getWidth();
    }

    bmp.getPixels(surface_pixels, 0, width, 0, 0, width, height);
    bmp.recycle();

    Image img = new Image(width, height, "RGB4");
 }

我希望这能帮助一些有同样问题的人。
如果有人想在onsurfacetexturewated中快速创建位图,请用代码示例进行响应。

07-25 23:32