有一个相机类,它是利用bitmap加载并解决了旋转问题
/**
* 调用系统相机拍照工具类
* @author yao
*
*/
public class CaremaUtil {
private static String strImgPath = "";// 照片的绝对路径
private static String imgPath = "";// 照片所在文件夹路径
// 保存的拍照文件
private static File out;
/**
* 相机照相并返回图片名字
*/
public static String cameraMethod(Activity activity, int requestCode) {
// 实例化拍照的Intent
Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 设置图片存放的路径,Environment.getExternalStorageDirectory()得到SD卡的根目录
// 先验证手机是否有sdcard
String status = Environment.getExternalStorageState();
if ((Environment.MEDIA_MOUNTED).equals(status)) {
strImgPath = getImgPath();
// 本地保存原图
File file = new File(strImgPath);
Uri u = Uri.fromFile(file);
imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, u);
// 启动ACITIVITY
activity.startActivityForResult(imageCaptureIntent, requestCode);
LogUtil.log("imageName---" + getImageName());
} else {
Toast.makeText(activity, "没有储存卡", 0).show();
}
return getImageName();
}
/**
* 返回图片的绝对路径
*
* @return
*/
public static String getImgPath() {
imgPath = getImagePath();// 存放照片的文件夹
LogUtil.log("图片存放的路径-----" + strImgPath);
String imageName = getImageName();
LogUtil.log("图片全名路径---" + imageName);
// 检查存放的路径是否存在,如果不存在则创建目录
try {
out = new File(imgPath);
if (!out.exists()) {
out.mkdirs();
}
// 在此目录下创建文件
out = new File(imgPath, imageName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 该照片的绝对路径
strImgPath = imgPath + imageName;
return strImgPath;
}
/**
* 得到图片所在的文件夹的路径
*
* @return
*/
public static String getImagePath() {
return Environment.getExternalStorageDirectory().getAbsolutePath() + "//"
+ SoftApplication.softApplication.getString(R.string.app_name) + "/approvalPic/";
}
/**
* 得到图片的名字
*
* @return
*/
public static String getImageName() {
// 给相片命名
String imageName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";// 照片命名
return imageName;
}
/**
* 显示图片并得到图片字节字符串
*
* @param resultCode
* @param data
*/
public static String showPic(Activity activity, Intent data, ImageView imageView) {
String iamgeStr = new String();
File file = new File(strImgPath);
try {
Uri uri = Uri.fromFile(file);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 简单的压缩
BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uri), null, options);
options.inSampleSize = 4;
options.inJustDecodeBounds = false; // 压缩完后便可以将inJustDecodeBounds设置为false
// 把流转化为Bitmap图片
Bitmap bitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uri), null,
options);
android.provider.MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null);
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
// 得到图片的旋转角度
int degree = getBitmapDegree(strImgPath);
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(degree);
Bitmap returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
imageView.setImageBitmap(returnBm);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bitmapByte = baos.toByteArray();
iamgeStr = StringUtil.encodeStr(bitmapByte);
LogUtil.log("iamgeStr", Log.ERROR, iamgeStr);
// LogUtil.log("iamgeStr1", Log.ERROR, imageStr1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return iamgeStr;
}
/**
* 清除本地拍照缓存
*/
public static void clearCacheImage() {
File filecache = new File(getImagePath());
LogUtil.log("filecache---" + filecache.getPath());
if (filecache != null && filecache.listFiles() != null) {
for (File file : filecache.listFiles()) {
if (file.isFile()) {
file.delete(); // 删除所有文件
LogUtil.log("删除所有文件");
}
}
}
}
/**
* 获取原始图片的角度(解决三星手机拍照后图片是横着的问题)
* @param path 图片的绝对路径
* @return 原始图片的角度
*/
public static int getBitmapDegree(String path) {
int degree = 0;
try {
// 从指定路径下读取图片,并获取其EXIF信息
ExifInterface exifInterface = new ExifInterface(path);
// 获取图片的旋转信息
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Log.e("jxf", "orientation" + orientation);
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;
}
}
如果要使用imagloader如何解决?
imagloader使用介绍:
网上很详细
我用imagloader加载本地uri图片并正确角度显示片:
/**
* 设置图片URL
* @param imageUrl
*/
public void setImageUrl(String imageUrl){
DisplayImageOptions options = new DisplayImageOptions.Builder()
.considerExifParams(true).build();
if(!imageUrl.contains("http://") && !imageUrl.contains("https://")){
imageUrl = "file:///"+imageUrl;
}
ImageLoader.getInstance().displayImage(imageUrl , imageView , options ,new HHYImageLoadListener() , new HHYImageLoadProgressListener());
}
其中重点就是
considerExifParams(true)
让其
是否考虑JPEG图像EXIF参数(旋转,翻转)
这样显示出来的图片就是正常角度的。