/* * Copyright (c) 2012 Socialize Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.socialize.util; import android.graphics.Bitmap; import android.util.DisplayMetrics; import java.io.ByteArrayOutputStream; import java.io.InputStream; /** * @author Jason Polites */ public class BitmapUtils { private BitmapBuilder bitmapBuilder; private Base64Utils base64Utils; private int defaultDensity = DisplayMetrics.DENSITY_DEFAULT; public BitmapUtils(BitmapBuilder bitmapBuilder) { super(); this.bitmapBuilder = bitmapBuilder; } public BitmapUtils() { super(); } public Bitmap getScaledBitmap(byte[] data, int scaleToWidth, int scaleToHeight) { return getScaledBitmap(bitmapBuilder.decode(data), scaleToWidth, scaleToHeight, defaultDensity); } public Bitmap getScaledBitmap(InputStream in, int scaleToWidth, int scaleToHeight) { return getScaledBitmap(bitmapBuilder.decode(in), scaleToWidth, scaleToHeight, defaultDensity); } public Bitmap getScaledBitmap(Bitmap bitmap, int scaleToWidth, int scaleToHeight) { return getScaledBitmap(bitmap, scaleToWidth, scaleToHeight, true, defaultDensity); } public Bitmap getScaledBitmap(byte[] data, int scaleToWidth, int scaleToHeight, int density) { return getScaledBitmap(bitmapBuilder.decode(data), scaleToWidth, scaleToHeight, density); } public Bitmap getScaledBitmap(InputStream in, int scaleToWidth, int scaleToHeight, int density) { return getScaledBitmap(bitmapBuilder.decode(in), scaleToWidth, scaleToHeight, density); } public Bitmap getScaledBitmap(Bitmap bitmap, int scaleToWidth, int scaleToHeight, int density) { return getScaledBitmap(bitmap, scaleToWidth, scaleToHeight, true, density); } public String encode(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object byte[] image = baos.toByteArray(); return base64Utils.encode(image); } /** * Returns a scaled bitmap, cropped if necessary. * @param bitmap * @param scaleToWidth * @param scaleToHeight * @param recycleOriginal * @return */ public Bitmap getScaledBitmap(Bitmap bitmap, int scaleToWidth, int scaleToHeight, boolean recycleOriginal, int density) { bitmap.setDensity(density); Bitmap original = bitmap; if (scaleToWidth > 0 || scaleToHeight > 0) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); // scale lowest and crop highes if (height != scaleToHeight || width != scaleToWidth) { float ratio = 1.0f; // Scale to smallest if (height > width) { ratio = (float) scaleToWidth / (float) width; width = scaleToWidth; height = Math.round((float) height * ratio); bitmap = bitmapBuilder.scale(bitmap, width, height); width = bitmap.getWidth(); height = bitmap.getHeight(); if (height > scaleToHeight) { // crop height int diff = height - scaleToHeight; int half = Math.round((float) diff / 2.0f); bitmap = bitmapBuilder.crop(bitmap, 0, half, width, scaleToHeight); } } else { ratio = (float) scaleToHeight / (float) height; height = scaleToHeight; width = Math.round((float) width * ratio); bitmap = bitmapBuilder.scale(bitmap, width, height); width = bitmap.getWidth(); height = bitmap.getHeight(); if (width > scaleToWidth) { // crop width int diff = width - scaleToWidth; int half = Math.round((float) diff / 2.0f); bitmap = bitmapBuilder.crop(bitmap, half, 0, scaleToWidth, height); } } if(recycleOriginal) { original.recycle(); } } } return bitmap; } public void setBitmapBuilder(BitmapBuilder bitmapBuilder) { this.bitmapBuilder = bitmapBuilder; } public void setBase64Utils(Base64Utils base64Utils) { this.base64Utils = base64Utils; } }