package com.amlogic.tzr.charismatic_yichang.Tool;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* Created by Administrator on 2015/7/18.
*/
public class BitmapUtil {
private static final String TAG = "BitmapUtil";
public static Bitmap transform(Bitmap source) {
int STROKE_WIDTH = 6;
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
if (squaredBitmap != source) {
source.recycle();
}
Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint avatarPaint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
avatarPaint.setShader(shader);
Paint outlinePaint = new Paint();
outlinePaint.setColor(Color.WHITE);
outlinePaint.setStyle(Paint.Style.STROKE);
outlinePaint.setStrokeWidth(STROKE_WIDTH);
outlinePaint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, avatarPaint);
canvas.drawCircle(r, r, r - STROKE_WIDTH / 2, outlinePaint);
squaredBitmap.recycle();
return bitmap;
}
public static String saveBitmap(Bitmap mBitmap, Context mContext) {
FileOutputStream out = null;
String dateTime = new Date(System.currentTimeMillis()).getTime() + "";
String file_path = CacheUtils.getExternalCacheDir(mContext, "icon_") + dateTime + ".jpg";
File f = new File(file_path);
if (f.exists()) {
f.delete();
}
try {
out = new FileOutputStream(f);
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e(TAG, "saveBitmap is ok");
return f.getAbsolutePath();
}
/**
* Try to return the absolute file path from the given Uri
*
* @param context
* @param uri
* @return the file path or null
*/
public static String getRealFilePath(final Context context, final Uri uri) {
if (null == uri) return null;
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Context mContext, Uri mUri,int reqWidth,
int reqHeight) throws FileNotFoundException {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(mUri), null , options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
LogManager.e(TAG," options.inSampleSize ="+ options.inSampleSize);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(mUri), null, options);
}
/**
* 通过资源id转化成Bitmap
*
* @param context
* @param resId
* @return
*/
public static Bitmap ReadBitmapById(Context context, int resId) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
/**
* 缩放Bitmap满屏
*
* @param bitmap
* @param screenWidth
* @param screenHight
* @return
*/
public static Bitmap getBitmap(Bitmap bitmap, int screenWidth,
int screenHight) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix matrix = new Matrix();
float scale = (float) screenWidth / w;
float scale2 = (float) screenHight / h;
// scale = scale < scale2 ? scale : scale2;
matrix.postScale(scale, scale);
Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
if (bitmap != null && !bitmap.equals(bmp) && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
return bmp;// Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
}
/**
* 按最大边按一定大小缩放图片
*/
public static Bitmap scaleImage(byte[] buffer, float size) {
// 获取原图宽度
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
options.inInputShareable = true;
Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length,
options);
// 计算缩放比例
float reSize = options.outWidth / size;
if (options.outWidth < options.outHeight) {
reSize = options.outHeight / size;
}
// 如果是小图则放大
if (reSize <= 1) {
int newWidth = 0;
int newHeight = 0;
if (options.outWidth > options.outHeight) {
newWidth = (int) size;
newHeight = options.outHeight * (int) size / options.outWidth;
} else {
newHeight = (int) size;
newWidth = options.outWidth * (int) size / options.outHeight;
}
bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);
bm = scaleImage(bm, newWidth, newHeight);
if (bm == null) {
Log.e(TAG, "convertToThumb, decode fail:" + null);
return null;
}
return bm;
}
// 缩放
options.inJustDecodeBounds = false;
options.inSampleSize = (int) reSize;
bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);
if (bm == null) {
Log.e(TAG, "convertToThumb, decode fail:" + null);
return null;
}
return bm;
}
/**
* 检查图片是否超过一定值,是则缩小
*/
public static Bitmap convertToThumb(byte[] buffer, float size) {
// 获取原图宽度
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
options.inInputShareable = true;
Bitmap bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length,
options);
// 计算缩放比例
float reSize = options.outWidth / size;
if (options.outWidth > options.outHeight) {
reSize = options.outHeight / size;
}
if (reSize <= 0) {
reSize = 1;
}
Log.d(TAG, "convertToThumb, reSize:" + reSize);
// 缩放
options.inJustDecodeBounds = false;
options.inSampleSize = (int) reSize;
if (bm != null && !bm.isRecycled()) {
bm.recycle();
bm = null;
Log.e(TAG, "convertToThumb, recyle");
}
bm = BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);
if (bm == null) {
Log.e(TAG, "convertToThumb, decode fail:" + null);
return null;
}
return bm;
}
/**
* Bitmap --> byte[]
*
* @param bmp
* @return
*/
private static byte[] readBitmap(Bitmap bmp) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 60, baos);
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
/**
* Bitmap --> byte[]
*
* @param
* @return
*/
public static byte[] readBitmapFromBuffer(byte[] buffer, float size) {
return readBitmap(convertToThumb(buffer, size));
}
/**
* 以屏幕宽度为基准,显示图片
*
* @return
*/
public static Bitmap decodeStream(Context context, Intent data, float size) {
Bitmap image = null;
try {
Uri dataUri = data.getData();
// 获取原图宽度
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPurgeable = true;
options.inInputShareable = true;
BitmapFactory.decodeStream(context.getContentResolver()
.openInputStream(dataUri), null, options);
// 计算缩放比例
float reSize = (int) (options.outWidth / size);
if (reSize <= 0) {
reSize = 1;
}
Log.d(TAG, "old-w:" + options.outWidth + ", llyt-w:" + size
+ ", resize:" + reSize);
// 缩放
options.inJustDecodeBounds = false;
options.inSampleSize = (int) reSize;
image = BitmapFactory.decodeStream(context.getContentResolver()
.openInputStream(dataUri), null, options);
} catch (Exception e) {
e.printStackTrace();
}
return image;
}
/**
* 按新的宽高缩放图片
*
* @param bm
* @param newWidth
* @param newHeight
* @return
*/
public static Bitmap scaleImage(Bitmap bm, int newWidth, int newHeight) {
if (bm == null) {
return null;
}
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,
true);
if (bm != null & !bm.isRecycled()) {
bm.recycle();
bm = null;
}
return newbm;
}
/**
* fuction: 设置固定的宽度,高度随之变化,使图片不会变形
*
* @param target 需要转化bitmap参数
* @param newWidth 设置新的宽度
* @return
*/
public static Bitmap fitBitmap(Bitmap target, int newWidth) {
int width = target.getWidth();
int height = target.getHeight();
Matrix matrix = new Matrix();
float scaleWidth = ((float) newWidth) / width;
// float scaleHeight = ((float)newHeight) / height;
int newHeight = (int) (scaleWidth * height);
matrix.postScale(scaleWidth, scaleWidth);
// Bitmap result = Bitmap.createBitmap(target,0,0,width,height,
// matrix,true);
Bitmap bmp = Bitmap.createBitmap(target, 0, 0, width, height, matrix,
true);
if (target != null && !target.equals(bmp) && !target.isRecycled()) {
target.recycle();
target = null;
}
return bmp;// Bitmap.createBitmap(target, 0, 0, width, height, matrix,
// true);
}
/**
* 根据指定的宽度平铺图像
*
* @param width
* @param src
* @return
*/
public static Bitmap createRepeater(int width, Bitmap src) {
int count = (width + src.getWidth() - 1) / src.getWidth();
Bitmap bitmap = Bitmap.createBitmap(width, src.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
for (int idx = 0; idx < count; ++idx) {
canvas.drawBitmap(src, idx * src.getWidth(), 0, null);
}
return bitmap;
}
/**
* 图片的质量压缩方法
*
* @param image
* @return
*/
public static Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
LogManager.e(TAG, "原图大小===" + baos.toByteArray().length);
int options = 90;
while ((baos.toByteArray().length )> 100*1024){ // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
LogManager.e(TAG, "(baos.toByteArray().length==="+baos.toByteArray().length );
LogManager.e(TAG, "image.compress(Bitmap.CompressFormat.JPEG, options, baos)----options==" + options);
baos.reset();// 重置baos即清空baos
options -= 10;// 每次都减少10
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
}
LogManager.e(TAG, "压缩后的图片大小===" + baos.toByteArray().length);
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (isBm != null) {
try {
isBm.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (image != null && !image.isRecycled()) {
image.recycle();
image = null;
}
return bitmap;
}
/**
* 图片按比例大小压缩方法(根据Bitmap图片压缩)
*
* @param image
* @return
*/
public static Bitmap getImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
if (baos.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
baos.reset();// 重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 这里压缩50%,把压缩后的数据存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = 800f;// 这里设置高度为800f
float ww = 480f;// 这里设置宽度为480f
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;// 设置缩放比例
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
if (isBm != null) {
try {
isBm.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (image != null && !image.isRecycled()) {
image.recycle();
image = null;
}
return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
}
/**
* 通过资源id转化成Bitmap 全屏显示
*
* @param context
* @param drawableId
* @param screenWidth
* @param screenHight
* @return
*/
public static Bitmap ReadBitmapById(Context context, int drawableId,
int screenWidth, int screenHight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inInputShareable = true;
options.inPurgeable = true;
InputStream stream = context.getResources().openRawResource(drawableId);
Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options);
return getBitmap(bitmap, screenWidth, screenHight);
}
public static Bitmap decodeUriAsBitmap(Context context, Uri uri) {
Bitmap mBitmapbitmap = null;
try {
mBitmapbitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return mBitmapbitmap;
}
}