import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.Base64;
import android.util.Log;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PictureUtil {
private static final String TAG = "PictureUtil";
private static final String fileDirectory = Environment.getExternalStorageDirectory() + File.separator + "photo";
public static String getMyFileDir() {
return fileDirectory;
}
private static String getImagePath(Context context, Uri uri, String selection) {
String path = null;
Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
public static void mkdirMyPetRootDirectory() {
boolean isSdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);// 判断sdcard是否存在
if (isSdCardExist) {
File MyPetRoot = new File(getMyFileDir());
if (!MyPetRoot.exists()) {
try {
MyPetRoot.mkdir();
Log.d(TAG, "mkdir success");
} catch (Exception e) {
Log.e(TAG, "exception->" + e.toString());
}
}
}
}
/**
* 将bitmap转为Base64字符串
*
* @param bitmap
* @return
*/
public static String bitmapToString(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, outputStream);
byte[] bytes = outputStream.toByteArray();
//Base64算法加密,当字符串过长(一般超过76)时会自动在中间加一个换行符,字符串最后也会加一个换行符。
// 导致和其他模块对接时结果不一致。所以不能用默认Base64.DEFAULT,而是Base64.NO_WRAP不换行
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
/**
* 将base64字符串转为bitmap
*
* @param base64String
* @return
*/
public static Bitmap base64ToBitmap(String base64String) {
byte[] bytes = Base64.decode(base64String, Base64.NO_WRAP);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return bitmap;
}
public static File compress(String path) {
File outputFile = new File(path);
long fileSize = outputFile.length();
final long fileMaxSize = 200 * 1024;
if (fileSize >= fileMaxSize) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
int height = options.outHeight;
int width = options.outWidth;
double scale = Math.sqrt((float) fileSize / fileMaxSize);
options.outHeight = (int) (height / scale);
options.outWidth = (int) (width / scale);
options.inSampleSize = (int) (scale + 0.5);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
outputFile = new File(saveMyBitmap(outputFile.getName()));
FileOutputStream fos = null;
try {
fos = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos);
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*if (!bitmap.isRecycled()) {
bitmap.recycle();
}else{
File tempFile = outputFile;
outputFile = new File(outputFile.getPath());
copyFileUsingFileChannels(tempFile, outputFile);
}*/
}
return outputFile;
}
private static String saveMyBitmap(String filename) {
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhwj/";
String filePath = baseDir + filename;
File dir = new File(baseDir);
if (!dir.exists()) {
dir.mkdir();
}
File f = new File(filePath);
try {
f.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
return filePath;
}
/**
* 保存图片到本地
*
* @param
* @return
*/
public static String saveBitmap(Bitmap bitmap, String name) {
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/kqxt/banner/";
File filePic;
try {
filePic = new File(savePath + name + ".jpg");
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
filePic.createNewFile();
}
FileOutputStream fos = new FileOutputStream(filePic);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
Log.d("xxx", "saveBitmap: 2return");
return null;
}
return filePic.getAbsolutePath();
}
/**
* 保存图片到本地
*
* @param bitmap 图片
* @param name 图片名字
* @return 返回图片在本地地址
*/
public static String saveBitmapPng(Bitmap bitmap, String name) {
// String savePath;
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zfzd/";
File filePic;
try {
filePic = new File(savePath + name + ".jpg");
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
filePic.createNewFile();
}
FileOutputStream fos = new FileOutputStream(filePic);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
Log.d("xxx", "saveBitmap: 2return");
return null;
}
return filePic.getAbsolutePath();
}
/**
* 根据本地地址得到bitmap图片
*
* @param filePath 图片的本地路径
* @return 返回显示的bitmap
*/
public static Bitmap getBitmap(String filePath) {
Bitmap cardBitmap = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
cardBitmap = BitmapFactory.decodeStream(fis);
return cardBitmap;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return cardBitmap;
}
//图片添加水印
public static Bitmap AddTimeWatermark(Bitmap mBitmap, String str) {
//获取原始图片与水印图片的宽与高
int mBitmapWidth = mBitmap.getWidth();
int mBitmapHeight = mBitmap.getHeight();
Bitmap mNewBitmap = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(mNewBitmap);
//向位图中开始画入MBitmap原始图片
mCanvas.drawBitmap(mBitmap, 0, 0, null);
//添加文字
TextPaint mPaint = new TextPaint();
String mFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
//String mFormat = TingUtils.getTime()+"\n"+" 纬度:"+GpsService.latitude+" 经度:"+GpsService.longitude;
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(30);
//水印的位置坐标
// String userName = SharedPreferenceUtil.getString(Constants.USERNAME, "");
// String project_name = SharedPreferenceUtil.getString(Constants.PROJECT_NAME, "");
// String org_name = SharedPreferenceUtil.getString(Constants.ORG_NAME, "");
// String waterStr =
// "所在项目:" + project_name + "\n" +
// "所在组织:" + org_name + "\n" +
// "打卡时间:" + str + "\n"
// + "考勤机编号:" + userName;
// mCanvas.drawText(waterStr, (mBitmapWidth * 1) / 10, (mBitmapHeight * 14) / 15, mPaint);
StaticLayout layoutopen = new StaticLayout(mFormat, mPaint, (int) 800, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
mCanvas.save();
mCanvas.translate((mBitmapWidth * 1) / 10, (mBitmapHeight * 13) / 15);
layoutopen.draw(mCanvas);
mCanvas.restore();
return mNewBitmap;
}
//去掉身份证空格
public static String getLocalCard(String card) {
byte bysIdCode[] = new byte[36];
bysIdCode = card.getBytes();
String cardStr = null;
try {
cardStr = new String(bysIdCode, "UTF-16LE");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return cardStr;
}
//判定文件是否存在
public static boolean fileIsExists(String strFile) {
try {
File f = new File(strFile);
if (!f.exists()) {
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
//url转bitmap
public static Bitmap getUrlBitmap(String imgUrl) {
InputStream inputStream = null;
ByteArrayOutputStream outputStream = null;
URL url = null;
try {
url = new URL(imgUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setReadTimeout(2000);
httpURLConnection.connect();
if (httpURLConnection.getResponseCode() == 200) {
//网络连接成功
inputStream = httpURLConnection.getInputStream();
outputStream = new ByteArrayOutputStream();
byte buffer[] = new byte[1024 * 8];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
// inputStream.close();
byte[] bu = outputStream.toByteArray();
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 2;
InputStream input = null;
input = new ByteArrayInputStream(bu);
SoftReference softRef = new SoftReference(BitmapFactory.decodeStream(
input, null, option));
Bitmap bitmap = (Bitmap) softRef.get();
if (bu != null) {
bu = null;
}
if (input != null) {
input.close();
}
// Bitmap bitmap = BitmapFactory.decodeByteArray(bu, 0, bu.length);
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// int options = 70;
// //压缩图片到100kb
// while (baos.toByteArray().length / 1024 > 100) {
// baos.reset();
// options -= 10;
// bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
// }
// bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
// byte[] bytes = baos.toByteArray();
//
// bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
// Log.d(TAG, "getUrlBitmap: size "+bytes.length);
return bitmap;
} else {
Log.d(TAG, "网络连接失败----" + httpURLConnection.getResponseCode());
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
/**
* 根据图片要显示的宽和高,对图片进行压缩,避免OOM
*
* @param path
* @param width 要显示的imageview的宽度
* @param height 要显示的imageview的高度
* @return
*/
public static Bitmap decodeSampledBitmapFromPath(String path, int width, int height) {
// 获取图片的宽和高,并不把他加载到内存当中
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = caculateInSampleSize(options, width, height);
// 使用获取到的inSampleSize再次解析图片(此时options里已经含有压缩比 options.inSampleSize,再次解析会得到压缩后的图片,不会oom了 )
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
return bitmap;
}
/**
* 根据需求的宽和高以及图片实际的宽和高计算SampleSize
*
* @param options
* @param reqWidth 要显示的imageview的宽度
* @param reqHeight 要显示的imageview的高度
* @return
* @compressExpand 这个值是为了像预览图片这样的需求,他要比所要显示的imageview高宽要大一点,放大才能清晰
*/
private static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
int width = options.outWidth;
int height = options.outHeight;
int inSampleSize = 1;
if (width >= reqWidth || height >= reqHeight) {
int widthRadio = Math.round(width * 1.0f / reqWidth);
int heightRadio = Math.round(width * 1.0f / reqHeight);
inSampleSize = Math.max(widthRadio, heightRadio);
}
return inSampleSize;
}
/**
* 将图片转换成十六进制字符串
*
* @param
* @return
*/
public static String bitmapTo16(String path) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);// (0 - 100)压缩文件
byte[] bt = stream.toByteArray();
String photoStr = byte2hex(bt);
Log.d("lll", "bitmapTo16: " + photoStr);
return photoStr;
}
/**
* 二进制转字符串
*
* @param b
* @return
*/
public static String byte2hex(byte[] b) {
StringBuilder sb = new StringBuilder();
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
sb.append("0" + stmp);
} else {
sb.append(stmp);
}
}
return sb.toString().toUpperCase();
}
/**
* 保存bitmap到文件夹
*
* @param bmp
* @param username 保存图片名字
* @param time 当前时间
* @return
*/
public static String compressBmpToFile(Bitmap bmp, String username, String time) {
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zfzd/";
String name = username;
bmp = AddTimeWatermark(bmp, time);
boolean dirExists = true;
File imgDir = new File(savePath);
if (!imgDir.exists()) {
dirExists = imgDir.mkdirs();
}
if (!dirExists) {
return "";
}
File filePic;
filePic = new File(savePath + name + ".jpg");
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
try {
filePic.createNewFile();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int options = 80;
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
while (baos.toByteArray().length / 1024 > 40) {
baos.reset();
options -= 10;
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
}
FileOutputStream fos = new FileOutputStream(filePic);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return filePic.getAbsolutePath();
}
/**
* 保存打卡图片并压缩到40kb一下
*
* @param image
* @param username
* @return
*/
public static String saveAttendBitmap(Bitmap image, String username) {
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zfzd/";
String name = username;
boolean dirExists = true;
File imgDir = new File(savePath);
if (!imgDir.exists()) {
dirExists = imgDir.mkdirs();
}
if (!dirExists) {
return "";
}
File filePic;
try {
filePic = new File(savePath + name + ".jpg");
if (!filePic.exists()) {
filePic.getParentFile().mkdirs();
filePic.createNewFile();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (baos == null) {
return "";
}
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 90;
while (baos.toByteArray().length / 1024 > 50) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset(); // 重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//
// 这里压缩options%,把压缩后的数据存放到baos中
if (options > 10) {//设置最小值,防止低于0时出异常
options -= 10;// 每次都减少10
Log.d(TAG, "saveAttendBitmap: option " + options);
}
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//
// 把压缩后的数据baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//
FileOutputStream fos = new FileOutputStream(filePic);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
Log.d(TAG, "saveAttendBitmap: " + filePic.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
Log.d("xxx", "saveBitmap: 2return");
return null;
}
return filePic.getAbsolutePath();
}
//删除文件或文件夹
public static boolean delete(String delFile) {
File file = new File(delFile);
if (!file.exists()) {
// Toast.makeText(getApplicationContext(), "删除文件失败:" + delFile + "不存在!", Toast.LENGTH_SHORT).show();
Log.d(TAG, "delete: 删除文件夹失败 " + delFile + "不存在");
return false;
} else {
if (file.isFile()) {
return deleteSingleFile(delFile);
} else {
return deleteDirectory(delFile);
}
}
}
/**
* 删除单个文件
*
* @param filePath$Name 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteSingleFile(String filePath$Name) {
File file = new File(filePath$Name);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
Log.e("--Method--", "Copy_Delete.deleteSingleFile: 删除单个文件" + filePath$Name + "成功!");
return true;
} else {
// Toast.makeText(getApplicationContext(), "删除单个文件" + filePath$Name + "失败!", Toast.LENGTH_SHORT).show();
Log.e(TAG, "deleteSingleFile: 删除单个文件" + filePath$Name + "失败");
return false;
}
} else {
Log.e(TAG, "deleteSingleFile: 删除单个文件" + filePath$Name + "不存在");
return false;
}
}
/**
* 删除目录及目录下的文件
*
* @param filePath 要删除的目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String filePath) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!filePath.endsWith(File.separator))
filePath = filePath + File.separator;
File dirFile = new File(filePath);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
Log.d(TAG, "deleteDirectory: 删除目录失败:" + filePath + "不存在!");
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (File file : files) {
// 删除子文件
if (file.isFile()) {
flag = deleteSingleFile(file.getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (file.isDirectory()) {
flag = deleteDirectory(file
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
Log.d(TAG, "deleteDirectory: 删除目录失败:");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
Log.e("--Method--", "Copy_Delete.deleteDirectory: 删除目录" + filePath + "成功!");
return true;
} else {
Log.d(TAG, "deleteDirectory: 删除目录:" + filePath + "失败!");
return false;
}
}
//camera 返回nv21数据转bitmap
public static Bitmap NV21ToBitmap(byte[] nv21, Camera.Size size) {
YuvImage image = new YuvImage(nv21, ImageFormat.NV21, size.width, size.height, null);
Bitmap bitmap = null;
if (image != null) {
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
bitmap = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* 获取图片文件的信息,是否旋转了90度,如果是则反转
*
* @param bitmap 需要旋转的图片
* @param path 图片的路径
*/
public static Bitmap reviewPicRotate(Bitmap bitmap, String path) {
int degree = getPicRotate(path);
if (degree != 0) {
Matrix m = new Matrix();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
m.setRotate(degree); // 旋转angle度
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);// 从新生成图片
}
return bitmap;
}
/**
* 读取图片文件旋转的角度
*
* @param path 图片绝对路径
* @return 图片旋转的角度
*/
public static int getPicRotate(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL
);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 计算图片的压缩比例;
*
* @param options 图片处理
* @param reqWidth 压缩的宽度
* @param reqHeight 压缩的高度;
*/
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);
LogUtils.i("heightRatio:" + ((float) height / (float) reqHeight)
+ "\nwidthRatio:" + ((float) width / (float) reqWidth));
// inSampleSize = heightRatio > widthRatio ? heightRatio : widthRatio;
//去缩放更小的那个:
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
// 保证size为1 、2、 4 这样的数,因为3 、5 之类会有异常。
if (inSampleSize > 1 && inSampleSize % 2 != 0) {
inSampleSize = inSampleSize - 1;
}
return inSampleSize;
}
/**
* 压缩图片
*
* @param filePath 传入要压缩的图片的路径
* @param width 目标width
* @param height 目标height
* @return
* @throws IOException
*/
public static Bitmap getSmallBitmap(String filePath, int width, int height) throws IOException {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
File file = new File(filePath);
FileInputStream fs = null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
assert fs != null;
Bitmap bitmap = BitmapFactory.decodeFileDescriptor(
fs.getFD(), null, options
);
// Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
if (bitmap == null) {
return null;
}
// bitmap = reviewPicRotate(bitmap, filePath);
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
// 处理图片 可修改保存格式和 质量
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
} finally {
try {
if (baos != null) baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* 压缩图片
*
* @param filePath 传入要压缩的图片的路径
* @param size 要压缩的大小
* @return
*/
public static Bitmap getSmallBitmap(String filePath, int size) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// Calculate inSampleSize
options.inSampleSize = size;
Log.i("Bitmap", "--" + options.inSampleSize);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
File file = new File(filePath);
FileInputStream fs = null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeFileDescriptor(
fs.getFD(), null, options
);
} catch (IOException e1) {
e1.printStackTrace();
}
// Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
if (bitmap == null) {
return null;
}
// 可选
// bitmap = reviewPicRotate(bitmap, filePath);
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
// 可定义
bitmap.compress(Bitmap.CompressFormat.JPEG, 75, baos);
} finally {
try {
if (baos != null) baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* @param resources 传入Resources
* @param resid 资源ID
* @param size 要压缩的大小
* @return
*/
public static Bitmap getSmallBitmap(Resources resources, int resid, int size) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(resources, resid, options);
// Calculate inSampleSize
options.inSampleSize = size;
Log.i("Bitmap", "--" + options.inSampleSize);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeResource(resources, resid, options);
if (bitmap == null) {
return null;
}
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
} finally {
try {
if (baos != null) baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* @param resources 传入Resources
* @param resid 资源ID
* @param width 目标width
* @param height 目标height
* @return
*/
public static Bitmap getSmallBitmap(Resources resources, int resid, int width, int height) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(resources, resid, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);
Log.i("Bitmap", "--" + options.inSampleSize);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeResource(resources, resid, options);
if (bitmap == null) {
return null;
}
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
} finally {
try {
if (baos != null) baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmap;
}
/**
* 画一个圆角图
*/
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
Bitmap output = Bitmap.createBitmap(
bitmap.getWidth(), bitmap.getHeight(), Bitmap.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(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
/**
* 缩放Bitmap图片
**/
public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidth = ((float) width / w);
float scaleHeight = ((float) height / h);
matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出
Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
return newbmp;
}
/**
* 转换图片成圆形
*
* @param bitmap 传入Bitmap对象
*/
public static Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
top = 0;
bottom = width;
left = 0;
right = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect(
(int) left, (int) top, (int) right, (int) bottom
);
final Rect dst = new Rect(
(int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom
);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, src, dst, paint);
return output;
}
}
图片处理工具类
最新推荐文章于 2021-03-04 11:40:21 发布