Resize Photo
/* * Copyright (C) 2011 The Pluroium Development Team. * * 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. */ //package org.pluroid.pluroium; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.Environment; import android.preference.PreferenceManager; class Utils { private static final String TAG = "Utils"; private static final float MEDIUM_SIZE = 640.0f; private static final float SMALL_SIZE = 240.0f; private static final int IO_BUFFER_SIZE = 4 * 1024; private static File getCacheDirectory(Context context, String dirname) { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); boolean useExternal = false; File directory; if (useExternal && Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { directory = Environment.getExternalStorageDirectory(); } else { directory = context.getCacheDir(); } File subdir = new File(directory, "pluroid"); if (!subdir.exists()) { subdir.mkdirs(); } return new File(subdir, dirname); } public static File ensureCache(Context context, String dirname) throws IOException { File cacheDirectory = getCacheDirectory(context, dirname); if (!cacheDirectory.exists()) { cacheDirectory.mkdirs(); new File(cacheDirectory, ".nomedia").createNewFile(); } return cacheDirectory; } private static void copy(InputStream in, OutputStream out) throws IOException { byte[] b = new byte[IO_BUFFER_SIZE]; int read; while ((read = in.read(b)) != -1) { out.write(b, 0, read); } } public static File resizePhoto(Context context, String filePath, String resize) throws IOException { BitmapFactory.Options option; Bitmap originalBitmap, resizedBitmap; File cacheDirectory = getCacheDirectory(context, "images"); if (!cacheDirectory.exists()) { cacheDirectory.mkdirs(); new File(cacheDirectory, ".nomedia").createNewFile(); } File newFilePath = new File(cacheDirectory, System.currentTimeMillis() + ".jpg"); option = new BitmapFactory.Options(); option.inJustDecodeBounds = true; originalBitmap = BitmapFactory.decodeFile(filePath, option); int w = option.outWidth, h = option.outHeight; int rw, rh; float newSize = "no".equals(resize) ? 0.0f : "medium".equals(resize) ? MEDIUM_SIZE : SMALL_SIZE; if (newSize == 0.0f) { FileInputStream fis = new FileInputStream(filePath); FileOutputStream fos = new FileOutputStream(newFilePath); copy(fis, fos); fis.close(); fos.close(); return newFilePath; } else { if (w > h && w >= newSize) { rw = (int) newSize; rh = (int) (h * newSize / w); } else if (h > w && h >= newSize) { rh = (int) newSize; rw = (int) (w * newSize / h); } else { rh = h; rw = w; } int scale = 1; while (true) { if (w / 2 < newSize || h / 2 < newSize) { break; } w /= 2; h /= 2; scale++; } option = new BitmapFactory.Options(); option.inSampleSize = scale - 1; originalBitmap = BitmapFactory.decodeFile(filePath, option); resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, rw, rh, true); FileOutputStream fos = new FileOutputStream(newFilePath); resizedBitmap.compress(CompressFormat.JPEG, 100, fos); fos.close(); return newFilePath; } } }