Ответ 1
Я не думаю, что есть такая возможность. Порядок байтов зависит от кодирования изображения (png, jpeg). Таким образом, вы вынуждены декодировать изображение, чтобы что-то сделать с ним.
Есть ли способ повернуть байтовый массив без декодирования его в Bitmap?
В настоящее время в jpeg PictureCallback я просто пишу массив байтов непосредственно в файл. Но картинки вращаются. Я хотел бы повернуть их без декодирования в растровое изображение с надеждой, что это сохранит мою память.
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(data, 0, data.length, o);
int orientation;
if (o.outHeight < o.outWidth) {
orientation = 90;
} else {
orientation = 0;
}
File photo = new File(tmp, "demo.jpeg");
FileOutputStream fos;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream(photo);
bos = new BufferedOutputStream(fos);
bos.write(data);
bos.flush();
} catch (IOException e) {
Log.e(TAG, "Failed to save photo", e);
} finally {
IOUtils.closeQuietly(bos);
}
Я не думаю, что есть такая возможность. Порядок байтов зависит от кодирования изображения (png, jpeg). Таким образом, вы вынуждены декодировать изображение, чтобы что-то сделать с ним.
Вы можете установить поворот JPEG через заголовок Exif без его декодирования. Это самый эффективный метод, но некоторые зрители могут по-прежнему показывать повернутое изображение.
В качестве альтернативы вы можете использовать вращение без потерь JPEG. К сожалению, я не знаю о свободных реализациях Java этого алгоритма.
Обновить на SourceForge, есть класс с открытым исходным кодом Java LLJTran. Порт Android находится на GitHub.
Попробуйте это. Это решит цель.
Bitmap storedBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, null); Matrix mat = new Matrix(); mat.postRotate("angle"); // angle is the desired angle you wish to rotate storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true);