我正在尝试在ImageView中显示位图。使用Camera2 API,我在ImageReader
上找到了ImageReader.OnImageAvailableListener
。然后,我从图像创建一个位图:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new
ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage()));
}
};
private class ImageSaver implements Runnable {
private final Image mImage;
public ImageSaver(Image image) {
mImage = image;
}
@Override
public void run() {
ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
// need to set the bitmap the size of the screen
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
从屏幕截图中可以看出,位图不会填满整个屏幕,而是横向而不是纵向。我的ImageView看起来像这样:
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
它的父级是RelativeLayout,它会填满整个屏幕。那我在做什么错?
最佳答案
使用Android Matrix类对我的情况有所帮助:
ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap,mImage.getWidth(),mImage.getHeight(),true);
Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap .getWidth(), scaledBitmap .getHeight(), matrix, true);
任何人都可以建议我这是一个好的解决方案,还是可以重构此代码?
关于android - 位图的大小和方向不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44981663/