Addev
Addev

Reputation: 32243

Decode a bitmap rotated

I'm looking for a way of decoding a bitmap from file rotated (0,90,180,270 degrees). I need that because the image is big and if I decode the bitmap and then use something like

Bitmap rotatedBitmap=Bitmap.createBitmap(source, x, y, width, height, m, filter)

There is a moment when both bitmap are in memory and there is risk of running out of memory.

Any ideas? Thanks.

Upvotes: 1

Views: 1106

Answers (2)

android developer
android developer

Reputation: 115952

If you wish to use an NDK based solution, I've created one here, and i've made a github project here .

this will avoid OOM by putting the data into the native C "world", recycle the old data, and return the result back, after rotation.

it doesn't require any downsampling.

Upvotes: 0

Dhruv Gairola
Dhruv Gairola

Reputation: 9182

Perhaps this is what you are looking for?

    //decodes image and scales it to reduce memory consumption
    //NOTE: if the image has dimensions which exceed int width and int height
    //its dimensions will be altered.
    private Bitmap decodeToLowResImage(byte [] b, int width, int height) {
        try {
            //Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new ByteArrayInputStream(b), null, o);

            //The new size we want to scale to
            final int REQUIRED_SIZE_WIDTH=(int)(width*0.7);
            final int REQUIRED_SIZE_HEIGHT=(int)(height*0.7);

            //Find the correct scale value. It should be the power of 2.
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE_WIDTH || height_tmp/2<REQUIRED_SIZE_HEIGHT)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }

            //Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new ByteArrayInputStream(b), null, o2);
        } catch (OutOfMemoryError e) {
            //handle this
        }
        return null;
    }

Upvotes: 1

Related Questions