gpt4 book ai didi

android - 从 SurfaceView 获取图像到 ImageView?

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:38 25 4
gpt4 key购买 nike

我在从用作相机预览的 SurfaceView 获取图像/可绘制对象或位图时遇到了一些麻烦。

    final CameraSurfaceView cameraSurfaceView = new CameraSurfaceView(this);
LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout1);
ll.addView(cameraSurfaceView); // THIS WORKS

ImageView ivCam = (ImageView) findViewById(R.id.ivCam);
ivCam.setImageBitmap(cameraSurfaceView.getDrawingCache()); // THIS DOESN'T :(

有什么建议吗?谢谢!

编辑:

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final CameraSurfaceView cameraSurfaceView = new CameraSurfaceView(this);
LinearLayout ll = (LinearLayout)findViewById(R.id.LLS);
ll.addView(cameraSurfaceView); // THIS WORKS


}

///////////////////////////////////////////////////////////////////////////////////////////////

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Camera camera;

public CameraSurfaceView(Context context)
{
super(context);

//Initiate the Surface Holder properly
this.holder = this.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

@Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
this.camera = Camera.open();
this.camera.setPreviewDisplay(this.holder);

this.camera.setPreviewCallback(new PreviewCallback() {

public void onPreviewFrame(byte[] _data, Camera _camera) {

Camera.Parameters params = _camera.getParameters();
int w = params.getPreviewSize().width;
int h = params.getPreviewSize().height;
int format = params.getPreviewFormat();
YuvImage image = new YuvImage(_data, format, w, h, null);

ByteArrayOutputStream out = new ByteArrayOutputStream();
Rect area = new Rect(0, 0, w, h);
image.compressToJpeg(area, 50, out);
Bitmap bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

ImageView ivCam = (ImageView) findViewById(R.id.imageView1);
ivCam.setImageBitmap(bm); /// NULL POINT EX HERE!
}
});

}
catch(IOException ioe)
{
ioe.printStackTrace(System.out);
}
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
this.camera.startPreview();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
this.camera.stopPreview();
this.camera.release();
this.camera = null;
}


public Camera getCamera()
{
return this.camera;
}


}

最佳答案

远比这复杂。 SurfaceView 的背景不是相机预览。您必须有一个实现 Camera.PreviewCalback 的类。一旦你有了它,你就可以获得一个字节数组,其中包含预览发送的图像。在某些手机上,您可以将预览设置为 JPEG,在这种情况下,您可以直接使用 BitmapFactory 对其进行解码。在不支持该功能的其他手机上,默认情况下您将获得 YUV 4:2:0 图像,您必须将其转换为 JPEG 图像。

在 Android 2.2+ 上,您可以像这样将 YUV 图像转换为 JPEG:

   int w = params.getPreviewSize().width;
int h = params.getPreviewSize().height;
int format = params.getPreviewFormat();
YuvImage image = new YuvImage(data, format, w, h, null);

ByteArrayOutputStream out = new ByteArrayOutputStream();
Rect area = new Rect(0, 0, w, h);
image.compressToJpeg(area, 50, out);
Bitmap bm = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());
ivCam.setImageBitmap(bm);

如果您的目标是旧型号,则必须使用此处所示的转换算法。

http://blog.tomgibara.com/post/132956174/yuv420-to-rgb565-conversion-in-android

SO 来源:

Getting frames from Video Image in Android

编辑:如果您只想显示相机 View ,那么您只需将相机正在使用的 SurfaceView 添加到已经显示的布局中,就像您在问题中所做的那样。它已经在显示它了。

关于android - 从 SurfaceView 获取图像到 ImageView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com