Я конвертирую изображение Android, захваченное в моем приложении, в растровое изображение. Я делаю это, получая буфер изображения из пиксельной плоскости изображения, а затем использую BitMapFactory для его декодирования в растровое изображение. Однако при этом разрешение изображения изменяется с 1920 x 1440 до 1800 x 1600, при этом верхняя и нижняя части изображения обрезаются. Здесь показан код метода.
`protected void getImageFromBuffer(ImageReader reader){
Image image = null;
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
System.out.println("Getting Image Ready");
synchronized (this){
image_to_upload = new byte[buffer.capacity()];
buffer.get(image_to_upload);
Bitmap storedBitmap = BitmapFactory.decodeByteArray(image_to_upload, 0, image_to_upload.length, null);
Matrix mat = new Matrix();
mat.postRotate(jpegOrientation); // angle is the desired angle you wish to rotate
storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
storedBitmap.compress(Bitmap.CompressFormat.JPEG,70, byteArrayOutputStream);
image_to_upload = byteArrayOutputStream.toByteArray();
image_ready = true;
System.out.println("Image Ready");
}
}`
Отладка показывает, что высота и ширина изображения верны до преобразования буфера в растровое изображение, но размеры растрового изображения неверны сразу после decodeByteArray. Кто-нибудь может подсказать, почему это может быть? Я проверил размеры перед применением матричного преобразования.
РЕДАКТИРОВАТЬ: Чтобы добавить дополнительные сведения, я попытался использовать BitmapFactory.Options(), чтобы отключить масштабирование или установить целевую плотность, и это не повлияло на результирующее растровое изображение, оно всегда имеет размер 1800 x 1600.
mat.postRotate(jpegOrientation);
правильно? Тогда используйтеMatrix#postScale()
. См. примеры здесь. - person Darkman   schedule 13.05.2021