当前位置:网站首页>图片工具
图片工具
2022-06-24 07:02:00 【Simon66991】
public class PhotoBitmapUtils {
/** * 存放拍摄图片的文件夹 */
private static final String FILES_NAME = "/MyPhoto";
/** * 获取的时间格式 */
public static final String TIME_STYLE = "yyyyMMddHHmmss";
/** * 图片种类 */
public static final String IMAGE_TYPE = ".png";
// 防止实例化
private PhotoBitmapUtils() {
}
/** * 获取手机可存储路径 * * @param context 上下文 * @return 手机可存储路径 */
private static String getPhoneRootPath(Context context) {
// 是否有SD卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
|| !Environment.isExternalStorageRemovable()) {
// 获取SD卡根目录
return context.getExternalCacheDir().getPath();
} else {
// 获取apk包下的缓存路径
return context.getCacheDir().getPath();
}
}
/** * 使用当前系统时间作为上传图片的名称 * * @return 存储的根路径+图片名称 */
public static String getPhotoFileName(Context context) {
File file = new File(getPhoneRootPath(context) + FILES_NAME);
// 判断文件是否已经存在,不存在则创建
if (!file.exists()) {
file.mkdirs();
}
// 设置图片文件名称
SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault());
Date date = new Date(System.currentTimeMillis());
String time = format.format(date);
String photoName = "/" + time + IMAGE_TYPE;
return file + photoName;
}
/** * 保存Bitmap图片在SD卡中 * 如果没有SD卡则存在手机中 * * @param mbitmap 需要保存的Bitmap图片 * @return 保存成功时返回图片的路径,失败时返回null */
public static String savePhotoToSD(Bitmap mbitmap, Context context) {
FileOutputStream outStream = null;
String fileName = getPhotoFileName(context);
try {
outStream = new FileOutputStream(fileName);
// 把数据写入文件,100表示不压缩
mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
return fileName;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (outStream != null) {
// 记得要关闭流!
outStream.close();
}
if (mbitmap != null) {
mbitmap.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/** * 把原图按1/10的比例压缩 * * @param path 原图的路径 * @return 压缩后的图片 */
public static Bitmap getCompressPhoto(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; // 图片的大小设置为原来的十分之一
Bitmap bmp = BitmapFactory.decodeFile(path, options);
options = null;
return bmp;
}
/** * 处理旋转后的图片 * @param originpath 原图路径 * @param context 上下文 * @return 返回修复完毕后的图片路径 */
public static String amendRotatePhoto(String originpath, Context context) {
// 取得图片旋转角度
int angle = readPictureDegree(originpath);
// 把原图压缩后得到Bitmap对象
Bitmap bmp = getCompressPhoto(originpath);;
// 修复图片被旋转的角度
Bitmap bitmap = rotaingImageView(angle, bmp);
// 保存修复后的图片并返回保存后的图片路径
return savePhotoToSD(bitmap, context);
}
/** * 读取照片旋转角度 * * @param path 照片路径 * @return 角度 */
public static int readPictureDegree(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 angle 被旋转角度 * @param bitmap 图片对象 * @return 旋转后的图片 */
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(angle);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bitmap;
}
if (bitmap != returnBm) {
bitmap.recycle();
}
return returnBm;
}
}
边栏推荐
- Two methods of QT exporting PDF files
- pyQt 常用系统的事件
- Easycvr invokes the interface parameter acquisition method and precautions of device video recording on the page
- JUC personal simple notes
- [real estate opening online house selection, WiFi coverage temporary network] 500 people are connected to WiFi at the same time
- String转Base64
- Question bank and simulation examination for operation certificate of refrigeration and air conditioning equipment in 2022
- Pat 1157: school anniversary
- 贷款五级分类
- lombok 使用
猜你喜欢

Question 4 - datepicker date selector, disabling two date selectors (start and end dates)

【无标题】

The article takes you to understand the security of Windows operating system and protect your computer from infringement

Redis cluster data skew

2021-03-11 comp9021 class 8 notes

小黑ai4code代码baseline啃食1

独立站运营中如何提升客户留存率?客户细分很重要!

ZUCC_ Principles of compiling language and compilation_ Experiment 02 fsharp Ocaml language

New technology practice, encapsulating the permission application library step by step with the activity results API

jwt(json web token)
随机推荐
The reason why the qtimer timer does not work
ZUCC_编译语言原理与编译_实验03 编译器入门
Catégorie de prêt 5
贷款五级分类
Micro build low code online "quick registration applet" capability
Tencent cloud ASR product PHP realizes real-time voice authentication request
pyQt 常用系统的事件
Common CVM transcribes audio using virtual sound card
饼状统计图,带有标注线,都可以自行设定其多种参数选项
ZUCC_编译语言原理与编译_实验02 FSharp OCaml语言
貸款五級分類
Review SGI STL secondary space configurator (internal storage pool) | notes for personal use
JS merge multiple objects and remove duplicates
How to implement approval function in Tekton
Tencent conference API - get rest API & webhook application docking information
js中通过key查找和更新对象中指定值的方法
How to improve the customer retention rate in the operation of independent stations? Customer segmentation is very important!
分布式 | 如何与 DBLE 进行“秘密通话”
New technology practice, encapsulating the permission application library step by step with the activity results API
ZUCC_ Principles of compiling language and compilation_ Experiment 02 fsharp Ocaml language