package com.af.experiments.FxCameraApp.Utils; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import java.io.BufferedInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class BitmapFactoryUtils { private BitmapFactoryUtils() {} public static Bitmap decodeFile(final String filename, final int maxSize, final boolean square) throws IOException { final int angle = ExifUtils.getAngle(filename); final BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true; BitmapFactory.decodeFile(filename, opts); final int size = Math.max(opts.outWidth, opts.outHeight); if (size > maxSize) { opts.inSampleSize = size / maxSize; } else { opts.inSampleSize = 1; } Bitmap bitmap = decodeFile(filename, opts.inSampleSize, 0, 2); if (angle != 0) { final Matrix matrix = new Matrix(); matrix.postRotate(angle); final Bitmap _bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); bitmap.recycle(); bitmap = _bitmap; } if (square && bitmap.getWidth() != bitmap.getHeight()) { if (bitmap.getWidth() > bitmap.getHeight()) { final Bitmap _bitmap = Bitmap.createBitmap(bitmap, (bitmap.getWidth() - bitmap.getHeight()) / 2, 0, bitmap.getHeight(), bitmap.getHeight()); bitmap.recycle(); bitmap = _bitmap; } else if (bitmap.getWidth() < bitmap.getHeight()) { final Bitmap _bitmap = Bitmap.createBitmap(bitmap, 0, (bitmap.getHeight() - bitmap.getWidth()) / 2, bitmap.getWidth(), bitmap.getWidth()); bitmap.recycle(); bitmap = _bitmap; } } return bitmap; } public static Bitmap decodeStream(final InputStream is) { return decodeStream(is, 1, 0, 2); } public static Bitmap decodeStream(final InputStream is, final int startInSampleSize, final int add, final int multi) { final BitmapFactory.Options opts = new BitmapFactory.Options(); int inSampleSize = startInSampleSize; while (true) { opts.inSampleSize = inSampleSize; opts.inDither = true; try { return BitmapFactory.decodeStream(is, null, opts); } catch (final OutOfMemoryError e) { inSampleSize = (inSampleSize + add) * multi; } } } public static Bitmap decodeResource(final Resources res, final int id) { return decodeResource(res, id, 1, 0, 2); } public static Bitmap decodeResource(final Resources res, final int id, final int startInSampleSize, final int add, final int multi) { final BitmapFactory.Options opts = new BitmapFactory.Options(); int inSampleSize = startInSampleSize; while (true) { opts.inSampleSize = inSampleSize; opts.inDither = true; try { return BitmapFactory.decodeResource(res, id, opts); } catch (final OutOfMemoryError e) { inSampleSize = (inSampleSize + add) * multi; } } } public static Bitmap decodeFile(final String pathName) { return decodeFile(pathName, 1, 0, 2); } public static Bitmap decodeFile(final String pathName, final int startInSampleSize, final int add, final int multi) { final BitmapFactory.Options opts = new BitmapFactory.Options(); int inSampleSize = startInSampleSize; while (true) { opts.inSampleSize = inSampleSize; opts.inDither = true; try { return BitmapFactory.decodeFile(pathName, opts); } catch (final OutOfMemoryError e) { inSampleSize = (inSampleSize + add) * multi; } } } public static Bitmap decodeStream(final Context context, final String name, final BitmapFactory.Options opts) throws FileNotFoundException { final InputStream in = new BufferedInputStream(context.openFileInput(name)); try { return BitmapFactory.decodeStream(in, null, opts); } finally { try { in.close(); } catch (final IOException e) {} // 無視する } } public static Bitmap decodeByteArray(final byte[] data, final Bitmap.Config config) { return decodeByteArray(data, 0, data.length, config); } public static Bitmap decodeByteArray(final byte[] data, final int offset, final int length, final Bitmap.Config config) { Bitmap bitmap = android.graphics.BitmapFactory.decodeByteArray(data, offset, length); if (bitmap.getConfig().compareTo(config) == 0) { return bitmap; } final int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); bitmap.recycle(); return Bitmap.createBitmap(pixels, bitmap.getWidth(), bitmap.getHeight(), config); } }