package cn.trinea.android.common.util; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; /** * ImageUtils * <ul> * convert between Bitmap, byte array, Drawable * <li>{@link #bitmapToByte(android.graphics.Bitmap)}</li> * <li>{@link #bitmapToDrawable(android.graphics.Bitmap)}</li> * <li>{@link #byteToBitmap(byte[])}</li> * <li>{@link #byteToDrawable(byte[])}</li> * <li>{@link #drawableToBitmap(android.graphics.drawable.Drawable)}</li> * <li>{@link #drawableToByte(android.graphics.drawable.Drawable)}</li> * </ul> * <ul> * get image * <li>{@link #getInputStreamFromUrl(String, int)}</li> * <li>{@link #getBitmapFromUrl(String, int)}</li> * <li>{@link #getDrawableFromUrl(String, int)}</li> * </ul> * <ul> * scale image * <li>{@link #scaleImageTo(android.graphics.Bitmap, int, int)}</li> * <li>{@link #scaleImage(android.graphics.Bitmap, float, float)}</li> * </ul> * * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-6-27 */ public class ImageUtils { private ImageUtils() { throw new AssertionError(); } /** * convert Bitmap to byte array * * @param b * @return */ public static byte[] bitmapToByte(Bitmap b) { if (b == null) { return null; } ByteArrayOutputStream o = new ByteArrayOutputStream(); b.compress(Bitmap.CompressFormat.PNG, 100, o); return o.toByteArray(); } /** * convert byte array to Bitmap * * @param b * @return */ public static Bitmap byteToBitmap(byte[] b) { return (b == null || b.length == 0) ? null : BitmapFactory.decodeByteArray(b, 0, b.length); } /** * convert Drawable to Bitmap * * @param d * @return */ public static Bitmap drawableToBitmap(Drawable d) { return d == null ? null : ((BitmapDrawable)d).getBitmap(); } /** * convert Bitmap to Drawable * * @param b * @return */ public static Drawable bitmapToDrawable(Bitmap b) { return b == null ? null : new BitmapDrawable(b); } /** * convert Drawable to byte array * * @param d * @return */ public static byte[] drawableToByte(Drawable d) { return bitmapToByte(drawableToBitmap(d)); } /** * convert byte array to Drawable * * @param b * @return */ public static Drawable byteToDrawable(byte[] b) { return bitmapToDrawable(byteToBitmap(b)); } /** * get input stream from network by imageurl, you need to close inputStream yourself * * @param imageUrl * @param readTimeOutMillis * @return * @see cn.trinea.android.common.util.ImageUtils#getInputStreamFromUrl(String, int, boolean) */ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis) { return getInputStreamFromUrl(imageUrl, readTimeOutMillis, null); } /** * get input stream from network by imageurl, you need to close inputStream yourself * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills * @param requestProperties http request properties * @return * @throws java.net.MalformedURLException * @throws java.io.IOException */ public static InputStream getInputStreamFromUrl(String imageUrl, int readTimeOutMillis, Map<String, String> requestProperties) { InputStream stream = null; try { URL url = new URL(imageUrl); HttpURLConnection con = (HttpURLConnection)url.openConnection(); HttpUtils.setURLConnection(requestProperties, con); if (readTimeOutMillis > 0) { con.setReadTimeout(readTimeOutMillis); } stream = con.getInputStream(); } catch (MalformedURLException e) { closeInputStream(stream); throw new RuntimeException("MalformedURLException occurred. ", e); } catch (IOException e) { closeInputStream(stream); throw new RuntimeException("IOException occurred. ", e); } return stream; } /** * get drawable by imageUrl * * @param imageUrl * @param readTimeOutMillis * @return * @see cn.trinea.android.common.util.ImageUtils#getDrawableFromUrl(String, int, boolean) */ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis) { return getDrawableFromUrl(imageUrl, readTimeOutMillis, null); } /** * get drawable by imageUrl * * @param imageUrl * @param readTimeOutMillis read time out, if less than 0, not set, in mills * @param requestProperties http request properties * @return */ public static Drawable getDrawableFromUrl(String imageUrl, int readTimeOutMillis, Map<String, String> requestProperties) { InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOutMillis, requestProperties); Drawable d = Drawable.createFromStream(stream, "src"); closeInputStream(stream); return d; } /** * get Bitmap by imageUrl * * @param imageUrl * @param readTimeOut * @return * @see cn.trinea.android.common.util.ImageUtils#getBitmapFromUrl(String, int, boolean) */ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut) { return getBitmapFromUrl(imageUrl, readTimeOut, null); } /** * get Bitmap by imageUrl * * @param imageUrl * @param requestProperties http request properties * @return */ public static Bitmap getBitmapFromUrl(String imageUrl, int readTimeOut, Map<String, String> requestProperties) { InputStream stream = getInputStreamFromUrl(imageUrl, readTimeOut, requestProperties); Bitmap b = BitmapFactory.decodeStream(stream); closeInputStream(stream); return b; } /** * scale image * * @param org * @param newWidth * @param newHeight * @return */ public static Bitmap scaleImageTo(Bitmap org, int newWidth, int newHeight) { return scaleImage(org, (float)newWidth / org.getWidth(), (float)newHeight / org.getHeight()); } /** * scale image * * @param org * @param scaleWidth sacle of width * @param scaleHeight scale of height * @return */ public static Bitmap scaleImage(Bitmap org, float scaleWidth, float scaleHeight) { if (org == null) { return null; } Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); return Bitmap.createBitmap(org, 0, 0, org.getWidth(), org.getHeight(), matrix, true); } /** * close inputStream * * @param s */ private static void closeInputStream(InputStream s) { if (s == null) { return; } try { s.close(); } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } } }