使用渲染脚本android旋转位图

时间:2015-12-10 02:33:51

标签: android bitmap renderscript

当我使用以下代码时,它会以outofmemory异常结束。做了研究之后,Render脚本看起来像个好人。我在哪里可以找到类似操作的示例代码以及如何将其集成到我的项目中。

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;
}

2 个答案:

答案 0 :(得分:1)

基本上旋转位图是旋转2D阵列而不使用额外内存的任务。这是RenderScript的正确实现:Android: rotate image without loading it to memory

但如果你想要的只是显示旋转的Bitmap,这不是必需的。您只需展开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脚本。

答案 1 :(得分:0)

试试这段代码..

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);