我有一个具有以下布局的应用
我想要做的就是拍摄照片/快照并观察它,看起来像是疯子/复杂
我首先拍摄了SurfaceView的快照并得到了一个黑色方块,看来这个方法不正确
现在我正在使用MediaProjection / ImageReader?
更新:所以我确实得到了一张图片但是有波浪线并且它崩溃了,因为我试图阻止MediaProjection。如上所述,我想做的就是拍一张照片
private void saveImage()
{
final Handler mHandler = new Handler();
final ImageReader mImageReader = ImageReader.newInstance(cameraSurface.getWidth(), cameraSurface.getHeight(), PixelFormat.RGBA_8888, 2);
mProjection.createVirtualDisplay("screen-mirror", cameraSurface.getWidth(), cameraSurface.getHeight(), mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
FileOutputStream fos = null;
Bitmap bitmap = null;
try {
image = mImageReader.acquireLatestImage();
fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/myscreen.jpg");
final Image.Plane[] planes = image.getPlanes();
final Buffer buffer = planes[0].getBuffer().rewind();
bitmap = Bitmap.createBitmap(cameraSurface.getWidth(), cameraSurface.getHeight(), Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
//MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Title" , "Desc");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos!=null) {
try {
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
if (bitmap!=null)
bitmap.recycle();
if (image!=null)
image.close();
if (mProjection!=null) {
mProjection.stop();
mImageReader.close();
}
}
}
}, mHandler);
}
答案 0 :(得分:2)
您正在为ImageFormat.RGB_565配置ImageReader,格式为0x4。虚拟显示器返回格式为0x1,PixelFormat.RGBA_8888的帧。 (是的,颜色格式有两个重叠的定义。)配置不匹配,因此错误。
将ImageReader创建行更改为使用RGBA_8888格式。
尝试创建位图时,您会遇到另一个问题。 decodeByteArray()
适用于压缩数据,例如PNG或JPEG。它不知道如何解释原始像素数据。请使用Bitmap#createBitmap()之类的通话,在Bitmap.Config参数中传递ARGB_8888。
(有关更一般的评论,请参阅this answer。)