X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/7a345cf83b4cf60f942a1cb7510363dbe4970c20..63de8e9229feb7dd09aab988c2d7baae354ef3d6:/src/com/owncloud/android/utils/BitmapUtils.java diff --git a/src/com/owncloud/android/utils/BitmapUtils.java b/src/com/owncloud/android/utils/BitmapUtils.java new file mode 100644 index 00000000..687b5a4f --- /dev/null +++ b/src/com/owncloud/android/utils/BitmapUtils.java @@ -0,0 +1,99 @@ +/* ownCloud Android client application + * Copyright (C) 2012-2014 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.owncloud.android.utils; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BitmapFactory.Options; + +/** + * Utility class with methods for decoding Bitmaps. + * + * @author David A. Velasco + */ +public class BitmapUtils { + + + /** + * Decodes a bitmap from a file containing it minimizing the memory use, known that the bitmap + * will be drawn in a surface of reqWidth x reqHeight + * + * @param srcPath Absolute path to the file containing the image. + * @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels. + * @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels. + * @return + */ + public static Bitmap decodeSampledBitmapFromFile(String srcPath, int reqWidth, int reqHeight) { + + // set desired options that will affect the size of the bitmap + final Options options = new Options(); + options.inScaled = true; + options.inPurgeable = true; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) { + options.inPreferQualityOverSpeed = false; + } + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { + options.inMutable = false; + } + + // make a false load of the bitmap to get its dimensions + options.inJustDecodeBounds = true; + + BitmapFactory.decodeFile(srcPath, options); + + // calculate factor to subsample the bitmap + options.inSampleSize = calculateSampleFactor(options, reqWidth, reqHeight); + + // decode bitmap with inSampleSize set + options.inJustDecodeBounds = false; + return BitmapFactory.decodeFile(srcPath, options); + + } + + + /** + * Calculates a proper value for options.inSampleSize in order to decode a Bitmap minimizing + * the memory overload and covering a target surface of reqWidth x reqHeight if the original + * image is big enough. + * + * @param options Bitmap decoding options; options.outHeight and options.inHeight should + * be set. + * @param reqWidth Width of the surface where the Bitmap will be drawn on, in pixels. + * @param reqHeight Height of the surface where the Bitmap will be drawn on, in pixels. + * @return The largest inSampleSize value that is a power of 2 and keeps both + * height and width larger than reqWidth and reqHeight. + */ + private static int calculateSampleFactor(Options options, int reqWidth, int reqHeight) { + + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + + if (height > reqHeight || width > reqWidth) { + final int halfHeight = height / 2; + final int halfWidth = width / 2; + + while ((halfHeight / inSampleSize) > reqHeight + && (halfWidth / inSampleSize) > reqWidth) { + inSampleSize *= 2; + } + } + + return inSampleSize; + } + +}