package com.banking.xc.utils;
import java.io.File;
import java.io.InputStream;
import skytv_com.banking.enjoymovie.MainActivity;
import skytv_com.banking.enjoymovie.MyApplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
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.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.banking.xc.utils.HttpGroup.HttpResponse;
import com.banking.xc.utils.cache.GlobalImageCache;
import com.banking.xc.utils.cache.GlobalImageCache.BitmapDigest;
import com.novoda.imageloader.core.bitmap.BitmapUtil;
public class ImageUtil {
public static final int DEFAULT_ROUND = 6;
public static final int IMAGE_MAX_WIDTH = 666;
public static final int IMAGE_MAX_HEIGHT = 666;
public static View inflate(int resource, ViewGroup root) {
try {
return getLayoutInflater().inflate(resource, root);
} catch (Throwable e) {
GlobalImageCache.getLruBitmapCache().clean();
}
return getLayoutInflater().inflate(resource, root);
}
public static View inflate(int resource, ViewGroup root, boolean attachToRoot) {
try {
return getLayoutInflater().inflate(resource, root, attachToRoot);
} catch (Throwable e) {
//GlobalImageCache.getLruBitmapCache().clean();
}
return getLayoutInflater().inflate(resource, root, attachToRoot);
}
private static LayoutInflater getLayoutInflater() {
LayoutInflater li = null;
MyActivity currentMyActivity = MyApplication.getInstance().getCurrentMyActivity();
MainActivity mainActivity = MyApplication.getInstance().getMainActivity();
if (null != currentMyActivity) {
li = LayoutInflater.from(currentMyActivity);
} else if (null != mainActivity) {
li = LayoutInflater.from(mainActivity);
} else {
li = (LayoutInflater) MyApplication.getInstance().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
return li;
}
/**
*
* @param drawable
* drawable图片
* @param roundPx
* 角度
* @return
* @Description:// 获得圆角图片的方法
*/
public static Bitmap getRoundedCornerBitmap(Drawable drawable, float roundPx) {
Bitmap bitmap = drawableToBitmap(drawable);
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
/**
*
* @param drawable
* @return
* @Description:将Drawable转化为Bitmap
*/
private static Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height,
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}
/**
* 根据bitmapDigest得到bitmap
*/
public static Bitmap createBitmap(InputWay inputWay, BitmapDigest bd) {
if(bd.isLarge()){
if (Log.D) {
Log.d(ImageUtil.class.getName(), "createBitmap() bitmapDigest isLarge let cleanMost -->> ");
}
GlobalImageCache.getLruBitmapCache().cleanMost();
}
int width = bd.getWidth();
int height = bd.getHeight();
Bitmap bitmap = createBitmap(inputWay, width, height);
if (null == bitmap) {
return null;
}
if (0 != bd.getRound()) {
bitmap = toRoundCorner(bitmap, bd.getRound());
}
return bitmap;
}
/**
* 根据宽高得到bitmap
*/
public static Bitmap createBitmap(InputWay inputWay, int width, int height) {
if (Log.D) {
Log.d(ImageUtil.class.getName(), "createBitmap() width=" + width + " height=" + height + " -->> ");
}
if (width > DPIUtil.dip2px(IMAGE_MAX_WIDTH)) {
width = DPIUtil.dip2px(IMAGE_MAX_WIDTH);
}
if (height > DPIUtil.dip2px(IMAGE_MAX_HEIGHT)) {
height = DPIUtil.dip2px(IMAGE_MAX_HEIGHT);
}
if (width == 0 && height == 0) {
width = DPIUtil.dip2px(IMAGE_MAX_WIDTH);
height = DPIUtil.dip2px(IMAGE_MAX_HEIGHT);
}
BitmapUtil bitmapUtil = new BitmapUtil();
Bitmap bitmap = null;
for (int i = 0; i < 2; i++) {
if (0 != inputWay.getResourceId()) {
bitmap = bitmapUtil.decodeResourceBitmapAndScale(MyApplication.getInstance(), width, height, inputWay.getResourceId(), false);
} else if (null != inputWay.getFile()) {
bitmap = bitmapUtil.decodeFileAndScale(inputWay.getFile(), width, height, false);
} else if (null != inputWay.getInputStream()) {
// TODO 重复尝试时肯定会出错
/*Bitmap unscaledBitmap = bitmapUtil.decodeInputStream(inputWay.getInputStream());
if (null == unscaledBitmap) {
bitmap = null;
} else {
bitmap = bitmapUtil.scaleBitmap(unscaledBitmap, width, height, false);
}*/
} else if (null != inputWay.getByteArray()) {
Bitmap unscaledBitmap = null;
try {
unscaledBitmap = BitmapFactory.decodeByteArray(inputWay.getByteArray(), 0, inputWay.getByteArray().length);
} catch (Throwable e) {
}
if (null == unscaledBitmap) {
bitmap = null;
} else {
bitmap = bitmapUtil.scaleBitmap(unscaledBitmap, width, height, false);
}
}
// 内存不足就会返回null
if (null == bitmap) {
GlobalImageCache.getLruBitmapCache().clean();
} else {
break;
}
}
if (Log.D) {
if (null != bitmap) {
Log.d(ImageUtil.class.getName(), "createBitmap() return width=" + bitmap.getWidth() + " height=" + bitmap.getHeight() + " -->> ");
}
}
return bitmap;
}
/**
* 圆角
*/
public static Bitmap toRoundCorner(Bitmap inBitmap, int dp) {
if (Log.D) {
Log.d(ImageUtil.class.getName(), "toRoundCorner() dp -->> " + dp);
}
float px = DPIUtil.dip2px(dp);
Bitmap outBitmap = Bitmap.createBitmap(inBitmap.getWidth(), inBitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(outBitmap);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, inBitmap.getWidth(), inBitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, px, px, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(inBitmap, rect, rect, paint);
inBitmap.recycle();
if (Log.D) {
Log.d(ImageUtil.class.getName(), "toRoundCorner() bitmap -->> " + outBitmap);
}
return outBitmap;
}
/**
* 把三种输入方式封装起来
*/
public static class InputWay {
private int resourceId;
private File file;
private InputStream inputStream;
private byte[] byteArray;
public static InputWay createInputWay(HttpResponse response) {
InputWay inputWay = new InputWay();
inputWay.setByteArray(response.getInputData());
inputWay.setFile(response.getSaveFile());
return inputWay;
}
public int getResourceId() {
return resourceId;
}
public void setResourceId(int resourceId) {
this.resourceId = resourceId;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public byte[] getByteArray() {
return byteArray;
}
public void setByteArray(byte[] byteArray) {
this.byteArray = byteArray;
}
}
}