Поверните растровое изображение с помощью рендеринга 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);