package org.aisen.wen.support.utils; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class BitmapUtil { private static final String TAG = BitmapUtil.class.getSimpleName(); public enum BitmapType { gif, jpg, png, bmp } public static BitmapType getType(byte[] imageData) { // 是否是jpg if (imageData.length >= 2) { if ((imageData[0] & 0xFF) == 0xFF && (imageData[1] & 0xD8) == 0xD8) { return BitmapType.jpg; } } // 是否是png if (imageData.length >= 8) { short[] png = new short[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; for (int i = 0; i < png.length; i++) { if ((imageData[i] & png[i]) != png[i]) { break; } if (i == png.length - 1) { return BitmapType.png; } } } // 是否是gif if (imageData.length >= 5) { short[] png = new short[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }; short fourIndex = 0x37; for (int i = 0; i < png.length; i++) { if ((imageData[i] & png[i]) != png[i] || (i == 4 && (imageData[i] & fourIndex) == fourIndex)) { break; } if (i == png.length - 1) { return BitmapType.gif; } } } // 是否是bmp if (imageData.length >= 2) { if ((imageData[0] & 0x42) == 0x42 && (imageData[1] & 0x4D) == 0x4D) { return BitmapType.bmp; } } return BitmapType.jpg; } /** * 获得图片的后缀 * * @param type * @return */ public static String getSuffix(BitmapType type) { switch (type) { case gif: return ".gif"; case jpg: return ".jpg"; case bmp: return ".bmp"; case png: return ".png"; default: return ".jpg"; } } public static Bitmap setImageCorner(Bitmap source, float roundPx) { Bitmap result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, source.getWidth(), source.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); paint.setColor(Color.RED); paint.setXfermode(null); paint.setAlpha(255); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(source, 0, 0, paint); source.recycle(); return result; } public static Bitmap zoomBitmap(Bitmap source, int width) { Matrix matrix = new Matrix(); float scale = width * 1.0f / source.getWidth(); matrix.setScale(scale, scale); Bitmap result = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); try { Logger.d( TAG, String.format("zoom bitmap, source(%d,%d) result(%d,%d)", source.getWidth(), source.getHeight(), result.getWidth(), result.getHeight())); } catch (Exception e) { } // source.recycle(); return result; } public static Bitmap decodeRegion(byte[] bytes, int width, int height) { try { BitmapRegionDecoder bitmapDecoder = BitmapRegionDecoder.newInstance(bytes, 0, bytes.length, true); Rect rect = new Rect(0, 0, width, height); return bitmapDecoder.decodeRegion(rect, null).copy(Bitmap.Config.ARGB_8888, true); } catch (Exception e) { } return null; } public static Bitmap rotateBitmap(Bitmap source, int degrees) { Matrix matrix = new Matrix(); matrix.setRotate(degrees, source.getWidth() / 2, source.getHeight() / 2); Bitmap result = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); try { Logger.d( TAG, String.format("rotate bitmap, source(%d,%d) result(%d,%d)", source.getWidth(), source.getHeight(), result.getWidth(), result.getHeight())); } catch (Exception e) { } source.recycle(); return result; } public static Bitmap getFromDrawableAsBitmap(Context context, String resName) { try { String packageName = context.getPackageName(); Resources resources = context.getPackageManager().getResourcesForApplication(packageName); int resId = resources.getIdentifier(resName, "drawable", packageName); try { if (resId != 0) return BitmapFactory.decodeResource(context.getResources(), resId); else Logger.e(String.format("配置的图片ResourceId=%s不存在", resName)); } catch (OutOfMemoryError e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 目前只支持JPG图片 * * @param resName * @return */ public static InputStream getFromDrawableAsStream(Context context, String resName) { try { String packageName = context.getPackageName(); Resources resources = context.getPackageManager().getResourcesForApplication(packageName); int resId = resources.getIdentifier(resName, "drawable", packageName); if (resId != 0) return Bitmap2InputStream(BitmapFactory.decodeResource(resources, resId)); else Logger.e(String.format("配置的图片ResourceId=%s不存在", resName)); } catch (Exception e) { e.printStackTrace(); } return null; } // 将byte[]转换成InputStream public static InputStream Byte2InputStream(byte[] b) { ByteArrayInputStream bais = new ByteArrayInputStream(b); return bais; } // 将InputStream转换成byte[] public static byte[] InputStream2Bytes(InputStream is) { String str = ""; byte[] readByte = new byte[1024]; @SuppressWarnings("unused") int readCount = -1; try { while ((readCount = is.read(readByte, 0, 1024)) != -1) { str += new String(readByte).trim(); } return str.getBytes(); } catch (Exception e) { e.printStackTrace(); } return null; } // 将Bitmap转换成InputStream public static InputStream Bitmap2InputStream(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); InputStream is = new ByteArrayInputStream(baos.toByteArray()); return is; } // 将Bitmap转换成InputStream public static InputStream Bitmap2InputStream(Bitmap bm, int quality) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, quality, baos); InputStream is = new ByteArrayInputStream(baos.toByteArray()); return is; } // 将InputStream转换成Bitmap public static Bitmap InputStream2Bitmap(InputStream is) { return BitmapFactory.decodeStream(is); } // Drawable转换成InputStream public static InputStream Drawable2InputStream(Drawable d) { Bitmap bitmap = drawable2Bitmap(d); return Bitmap2InputStream(bitmap); } // InputStream转换成Drawable public static Drawable InputStream2Drawable(Context context, InputStream is) { Bitmap bitmap = InputStream2Bitmap(is); return bitmap2Drawable(context, bitmap); } // Drawable转换成byte[] public static byte[] Drawable2Bytes(Drawable d) { Bitmap bitmap = drawable2Bitmap(d); return Bitmap2Bytes(bitmap); } // byte[]转换成Drawable public static Drawable Bytes2Drawable(Context context, byte[] b) { Bitmap bitmap = Bytes2Bitmap(b); return bitmap2Drawable(context, bitmap); } // Bitmap转换成byte[] public static byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } // byte[]转换成Bitmap public static Bitmap Bytes2Bitmap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } return null; } // Drawable转换成Bitmap public static Bitmap drawable2Bitmap(Drawable drawable) { Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } // Bitmap转换成Drawable public static Drawable bitmap2Drawable(Context context, Bitmap bitmap) { BitmapDrawable bd = new BitmapDrawable(context.getResources(), bitmap); Drawable d = (Drawable) bd; return d; } }