user2891178
user2891178

Reputation: 11

Resizing uploaded photo from device gallery to display it in ImageView

I am implementing an android program that allows users to upload photos from their device gallery to an ImageView. saving it in the cloud. My code works fine with small photos, but bigger photos caused the application to stop. I'm getting this error:

Bitmap too large to be uploaded into a texture (4128x2322, max=4096x4096)

I tried to resize the uploaded photo before displaying it using suggestions from previous questions, but they didn't work. I am not sure what the problem with my code is.

Any help would be appreciated. Here is the code from my last attempt:

{
    // omitted code segment from onCreate...
    browseButton = ((Button) findViewById(R.id.browse_button));
    browseButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
            }
        }
    );
}
//end on create

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == RESULT_OK)
    {
        if (requestCode == SELECT_PICTURE)
        {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath);
            // Convert it to byte
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            // Compress image to lower quality scale 1 - 100
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
            image = stream.toByteArray();
            bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
            Bitmap toyImageScaled = Bitmap.createScaledBitmap(bitmap, 200, 200
            * bitmap.getHeight() / bitmap.getWidth(), false);
            // Override Android default landscape orientation and save portrait
            Matrix matrix = new Matrix();
            matrix.postRotate(90);
            Bitmap rotatedScaledToyImage = Bitmap.createBitmap(toyImageScaled, 0,
            0, toyImageScaled.getWidth(), toyImageScaled.getHeight(),
            matrix, true);
            toyPreview.setImageBitmap(bitmap);
        }
    }
}

public String getPath(Uri uri)
{
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

Upvotes: 0

Views: 2794

Answers (2)

user2751837
user2751837

Reputation: 36

You're still showing the big image at:

toyPreview.setImageBitmap(bitmap);

You should be showing the scaled image, toyImageScaled or rotatedScaledToyImage.

Upvotes: 1

Tobiel
Tobiel

Reputation: 1543

I think you should use the examples of the documentation, and use InSampleSize.

see this : http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

From DOCS:

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

    // Calculate ratios of height and width to requested height and width
    final int heightRatio = Math.round((float) height / (float) reqHeight);
    final int widthRatio = Math.round((float) width / (float) reqWidth);

    // Choose the smallest ratio as inSampleSize value, this will guarantee
    // a final image with both dimensions larger than or equal to the
    // requested height and width.
    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}

return inSampleSize;

}

Upvotes: 0

Related Questions