Поверните растровое изображение с помощью рендеринга script android
Когда я использую следующий код, он заканчивается исключением outofmemory. После исследования Render script выглядит хорошим кандидатом. Где я могу найти пример кода для аналогичной операции и как его можно интегрировать в мой проект.
public Bitmap rotateBitmap(Bitmap image, int angle) {
if (image != null) {
Matrix matrix = new Matrix();
matrix.postRotate(angle, (image.getWidth()) / 2,
(image.getHeight()) / 2);
return Bitmap.createBitmap(image, 0, 0, image.getWidth(),
image.getHeight(), matrix, true);
}
return null;
}
Ответы
Ответ 1
В основном вращающееся растровое изображение представляет собой задачу вращения 2D-массива без использования дополнительной памяти. И это правильная реализация с RenderScript: Android: повернуть изображение, не загружая его в память.
Но это не обязательно, если все, что вам нужно, это просто показать повернутое растровое изображение. Вы можете просто расширить ImageView
и повернуть Canvas
во время рисования на нем:
canvas.save();
canvas.rotate(angle, X + (imageW / 2), Y + (imageH / 2));
canvas.drawBitmap(imageBmp, X, Y, null);
canvas.restore();
Что касается ScriptIntrinsic, так как это просто встроенные ядра RenderScript для общих операций, вы не можете ничего делать над уже реализованными функциями: ScriptIntrinsic3DLUT, ScriptIntrinsicBLAS, ScriptIntrinsicBlend, ScriptIntrinsicBlur, ScriptIntrinsicColorMatrix, ScriptIntrinsicConvolve3x3, ScriptIntrinsicConvolve5x5, ScriptIntrinsicHistogram, ScriptIntrinsicLUT, ScriptIntrinsicResize, ScriptIntrinsicYuvToRGB
. Они не включают функциональные возможности для поворота растрового изображения в настоящий момент, поэтому вы должны создать свой собственный ScriptC script.
Ответ 2
Попробуйте этот код..
private Bitmap RotateImage(Bitmap _bitmap, int angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
_bitmap = Bitmap.createBitmap(_bitmap, 0, 0, _bitmap.getWidth(), _bitmap.getHeight(), matrix, true);
return _bitmap;
}
Используйте этот код при выборе изображения из галереи.
как это..
File _file = new File(file_name);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeFile(file_name, options);
try {
ExifInterface exif = new ExifInterface(file_name);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
bitmap = RotateImage(bitmap, 90);
} else if (orientation ==ExifInterface.ORIENTATION_ROTATE_270) {
bitmap = RotateImage(bitmap, 270);
}
} catch (Exception e) {
e.printStackTrace();
}
image_holder.setImageBitmap(bitmap);