package vandy.mooc.utils; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.provider.MediaStore; /** * BitmapUtils * * This helper class encapsulates Bitmap-specific processing methods. */ public class BitmapUtils { /** * Constants used in the image's filenames when saving */ private static final String JPEG_FILE_PREFIX = "IMG_"; private static final String JPEG_FILE_SUFFIX = ".jpg"; /** * Creates a new file to store an image in. * * @return A File created to store a new image. * @throws IOException */ public static File createImageFile(File albumDir, String prefix, String suffix) throws IOException { // Create an image file name. String currentTimeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()); String imageFileName = prefix + currentTimeStamp; File imageFile = new File(albumDir.getAbsolutePath() + "/" + imageFileName + suffix); imageFile.createNewFile(); return imageFile; } /** * Dispatches an intent notifying the device's camera app to take * a new picture, and updates the current photo path to reflect * where the photo will be saved * * @param actionCode */ public static Intent getTakePictureIntent(File albumDir) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File f = null; try { f = BitmapUtils.createImageFile(albumDir, JPEG_FILE_PREFIX, JPEG_FILE_SUFFIX); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); } catch (IOException e) { e.printStackTrace(); f = null; } return takePictureIntent; } /** * This returns the sample size that should be used when * down-sampling the image. This ensures that the image is scaled * appropriately with respect to it's final display size. */ 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) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a // power of 2 and keeps both // height and width larger than the requested height and // width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } /** * This will return a bitmap that is loaded and appropriately scaled * from the filepath parameter. */ public static Bitmap decodeSampledBitmapFromFile(String filepath, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check // dimensions. final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filepath, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filepath, options); } /** * Helper method used to determine an appropriate name for a * processed file. */ public static String getNewFileName(String orgFile) { String newFilePath = orgFile.replace(JPEG_FILE_SUFFIX, "edit1" + JPEG_FILE_SUFFIX); File processedImgFile = new File(newFilePath); int editNum = 1; // Increase the file's edit number until there isn't a // conflict while (processedImgFile.exists()) processedImgFile = (new File(newFilePath = newFilePath.replace (editNum + JPEG_FILE_SUFFIX, ++editNum + JPEG_FILE_SUFFIX))); return processedImgFile.getAbsolutePath(); } /** * Ensure this class is only used as a utility. */ private BitmapUtils() { throw new AssertionError(); } }