之前写的《Android获取SD卡上所有图片、视频缩略图和音乐专辑封面》获取到了图片并显示,现在需要对图片进行旋转操作,并且要保存旋转后的图片。
分为三个步骤:
1.获得图片文件的路径及Bitmap格式的图片
2.旋转图片一定角度,得到新图片
3.把新图片保存到原来的路径,即覆盖原来的图片保存
1.获得图片文件的路径及Bitmap格式的图片
根据之前写的《Android获取SD卡上所有图片、视频缩略图和音乐专辑封面》很容易就完成第一步:
//获取图片
Bitmap picture = BitmapFactory.decodeFile(mFileInfo.getFilePath());
2.旋转图片一定角度,得到新图片
用Matrix来旋转图片。
/**
* @Description 旋转图片一定角度
* @param bitmap 要旋转的图片
* @param degree 要旋转的角度
* @return 旋转后的图片
*/
public Bitmap rotatePicture(final Bitmap bitmap, final int degree) {
Matrix matrix = new Matrix();
matrix.postRotate(degree);
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
3.把新图片保存到原来的路径,即覆盖原来的图片保存
/**
* @Description 保存图片到指定路径
* @param bitmap 要保存的图片
* @param filePath 目标路径
* @return 是否成功
*/
public boolean saveBmpToPath(final Bitmap bitmap, final String filePath) {
if (bitmap == null || filePath == null) {
return false;
}
boolean result = false; //默认结果
File file = new File(filePath);
OutputStream outputStream = null; //文件输出流
try {
outputStream = new FileOutputStream(file);
result = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); //将图片压缩为JPEG格式写到文件输出流,100是最大的质量程度
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStram != null) {
try {
outputStream.close(); //关闭输出流
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
示例:完整调用
以下为我项目用到的代码片段,其中FileInfo
为自定义数据结构
public boolean doRotate(final int degree) {
//得到Gallery当前选中的item的数据
FileInfo fileInfo = (FileInfo) mPictureGallery.getSelectedItem();
//第一步
Bitmap picture = BitmapFactory.decodeFile(fileInfo.getFilePath());
//第二步
Bitmap resizePicture = rotatePicture(picture, degree);
//第三步
saveBmpToPath(resizePicture, fileInfo.getFilePath());
//更新Gallery显示
mPictureGallery.updateData();
}
Reference:《Android 图片Bitmap保存到内存卡》
如果你又任何问题,欢迎留言告诉我!