Java 使用MediaProjection API拍摄屏幕截图时的额外填充
我正在使用下面的代码获取一个屏幕截图。我得到了截图,但是图像上有黑色的填充物。此处使用了在internet上找到的用于截图和删除填充的代码示例:Java 使用MediaProjection API拍摄屏幕截图时的额外填充,java,android,screenshot,android-mediaprojection,Java,Android,Screenshot,Android Mediaprojection,我正在使用下面的代码获取一个屏幕截图。我得到了截图,但是图像上有黑色的填充物。此处使用了在internet上找到的用于截图和删除填充的代码示例: // requesting permission MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService( Context.MEDIA_PROJECTION_SERVICE); startAc
// requesting permission
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(
Context.MEDIA_PROJECTION_SERVICE);
startActivityForResult(projectionManager.createScreenCaptureIntent(), REQUEST_SCREENSHOT);
// requesting screenshot on successful permission (in onActivityResult)
if (requestCode == REQUEST_SCREENSHOT && resultCode == RESULT_OK) {
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
final MediaProjection mProjection = projectionManager.getMediaProjection(resultCode, data);
Display mDisplay = getWindowManager().getDefaultDisplay();
Point size = new Point();
mDisplay.getSize(size);
final int width = size.x;
final int height = size.y;
final ImageReader mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
mProjection.createVirtualDisplay("screen-mirror", width, height,
getResources().getDisplayMetrics().densityDpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY |
DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, mImageReader.getSurface(),
null, null);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader imageReader) {
final Image image = imageReader.acquireLatestImage();
if (image != null) {
mImageReader.setOnImageAvailableListener(null, null);
mProjection.stop();
final Image.Plane[] planes = image.getPlanes();
final ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * width;
// create bitmap
Bitmap bmp = Bitmap.createBitmap(
width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(buffer);
image.close();
ImageView iv = findViewById(R.id.iv);
iv.setImageBitmap(bmp);
}
}
}, null);
}
这是一个屏幕截图显示我得到了什么。我正在将位图加载到活动中的ImageView中。
首先,您得到的尺寸不正确。 您应更改为:
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getRealSize(size);
然后,您应该根据从缓冲区获得的位图创建另一个位图
Bitmap newBitmap = Bitmap.createBitmap(bmp, 0, 0, mWidth, mHeight);
bmp.recycle();
ImageView iv = findViewById(R.id.iv);
iv.setImageBitmap(newBitmap);
这很好用,但是我可以用一个位图吗?性能对我的应用程序的使用至关重要,我注意到创建两个位图需要额外的时间。我认为,无法使用一个位图。如果要将位图设置为ImageView,可以将ImageView比率(宽度:高度)设置为mWidth/mHeight,将scaleType设置为fitStart