Android examples for Graphics:Bitmap Create
Creates a bitmap by either down sampling from the thumbnail in EXIF or the full image.
/*//from w ww .j a v a 2 s . c om * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; import android.media.ExifInterface; import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.provider.BaseColumns; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.Thumbnails; import android.util.Log; import java.io.FileInputStream; import java.io.FileDescriptor; import java.io.IOException; import java.io.OutputStream; public class Main{ private static final String TAG = "ThumbnailUtils"; private static final int UNCONSTRAINED = -1; /** * Creates a bitmap by either downsampling from the thumbnail in EXIF or the full image. * The functions returns a SizedThumbnailBitmap, * which contains a downsampled bitmap and the thumbnail data in EXIF if exists. */ private static void createThumbnailFromEXIF(String filePath, int targetSize, int maxPixels, SizedThumbnailBitmap sizedThumbBitmap) { if (filePath == null) return; ExifInterface exif = null; byte[] thumbData = null; try { exif = new ExifInterface(filePath); if (exif != null) { thumbData = exif.getThumbnail(); } } catch (IOException ex) { Log.w(TAG, ex); } BitmapFactory.Options fullOptions = new BitmapFactory.Options(); BitmapFactory.Options exifOptions = new BitmapFactory.Options(); int exifThumbWidth = 0; int fullThumbWidth = 0; // Compute exifThumbWidth. if (thumbData != null) { exifOptions.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(thumbData, 0, thumbData.length, exifOptions); exifOptions.inSampleSize = computeSampleSize(exifOptions, targetSize, maxPixels); exifThumbWidth = exifOptions.outWidth / exifOptions.inSampleSize; } // Compute fullThumbWidth. fullOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, fullOptions); fullOptions.inSampleSize = computeSampleSize(fullOptions, targetSize, maxPixels); fullThumbWidth = fullOptions.outWidth / fullOptions.inSampleSize; // Choose the larger thumbnail as the returning sizedThumbBitmap. if (thumbData != null && exifThumbWidth >= fullThumbWidth) { int width = exifOptions.outWidth; int height = exifOptions.outHeight; exifOptions.inJustDecodeBounds = false; sizedThumbBitmap.mBitmap = BitmapFactory.decodeByteArray( thumbData, 0, thumbData.length, exifOptions); if (sizedThumbBitmap.mBitmap != null) { sizedThumbBitmap.mThumbnailData = thumbData; sizedThumbBitmap.mThumbnailWidth = width; sizedThumbBitmap.mThumbnailHeight = height; } } else { fullOptions.inJustDecodeBounds = false; sizedThumbBitmap.mBitmap = BitmapFactory.decodeFile(filePath, fullOptions); } } private static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize( BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == UNCONSTRAINED) ? 1 : (int) Math .ceil(Math.sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == UNCONSTRAINED) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { // return the larger one when there is no overlapping zone. return lowerBound; } if ((maxNumOfPixels == UNCONSTRAINED) && (minSideLength == UNCONSTRAINED)) { return 1; } else if (minSideLength == UNCONSTRAINED) { return lowerBound; } else { return upperBound; } } }