Android 旋转本地图片并保存覆盖原图片

Android手机千变万化,适配真是个大问题。最近在做本地图片保存并上传服务器时,发现某些手机(三星)上传到服务器图片横向显示。特意上网去查了下,解决了问题。解决思路很简单:获取到图片之后看图片是否有旋转,并得到旋转的角度,再转回来。下面看实现逻辑:


第一步:获取指定路径指定大小的图片(500*500)这里暂时先规定500*500


	/**
	 * 
	 * 获取指定路径指定大小的图片(500*500)
	 * 
	 * @param filePath
	 * @return Bitmap
	 * @exception 异常描述
	 * @see 需要参见的其它内容
	 * @since 从类的哪一个版本,此方法被添加进来。(可选)
	 * @deprecated该方法从类的那一个版本后,已经被其它方法替换。(可选)
	 */
	public static Bitmap getCompressBm(String filePath) {
		Bitmap bm = null;
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, options);
		// Calculate inSampleSize
		options.inSampleSize = calculateInSampleSize(options, 500, 500);
		// Decode bitmap with inSampleSize set
		options.inJustDecodeBounds = false;
		bm = BitmapFactory.decodeFile(filePath, options);
		return bm;
	}


第二步:获取图片旋转角度


	/**
	 * 
	 * 获取照片旋转角度
	 * 
	 * @param rotate
	 * @return int
	 * @exception 异常描述
	 * @see 需要参见的其它内容
	 * @since 从类的哪一个版本,此方法被添加进来。(可选)
	 * @deprecated该方法从类的那一个版本后,已经被其它方法替换。(可选)
	 */
	public static int getCameraPhotoOrientation(String imagePath) {
		int rotate = 0;
		try {
			File imageFile = new File(imagePath);
			ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
			int orientation = exif.getAttributeInt(
					ExifInterface.TAG_ORIENTATION,
					ExifInterface.ORIENTATION_NORMAL);

			switch (orientation) {
			case ExifInterface.ORIENTATION_ROTATE_270:
				rotate = 270;
				break;
			case ExifInterface.ORIENTATION_ROTATE_180:
				rotate = 180;
				break;
			case ExifInterface.ORIENTATION_ROTATE_90:
				rotate = 90;
				break;
			}

			// Log.v(TAG, "Exif orientation: " + orientation);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rotate;
	}


第三步:旋转图片

/**
	 * 
	 * 旋转图片
	 * 
	 * @param bitmap
	 *            rotate
	 * @return 返回类型
	 * @exception 异常描述
	 * @see 需要参见的其它内容
	 * @since 从类的哪一个版本,此方法被添加进来。(可选)
	 * @deprecated该方法从类的那一个版本后,已经被其它方法替换。(可选)
	 */
	public static Bitmap rotateBitmap(Bitmap bitmap, int rotate) {
		if (bitmap == null)
			return null;

		int w = bitmap.getWidth();
		int h = bitmap.getHeight();

		// Setting post rotate to 90
		Matrix mtx = new Matrix();
		mtx.postRotate(rotate);
		return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
	}

第四步:保存图片到指定路径并覆盖原图片

/**
	 * @Description 保存图片到指定路径
	 * @param bitmap
	 *            要保存的图片
	 * @param filePath
	 *            目标路径
	 * @return 是否成功
	 */
	@SuppressWarnings("finally")
	public static 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 (outputStream != null) {
				try {
					outputStream.close(); // 关闭输出流
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return result;
		}
	}

第五步:获取到修改过的图片进行上传,这里就不写上传了。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值