解决调用系统拍照保存的图片被压缩的问题

这几天在做微信分享,要求实现拍照分享的功能。本想用网上的方法调用系统的相机然后拍照保存就可以了,没想到保存后的图片是压缩过的。没办法,自己动手吧。

研究一阵子后发现原来原因就是这句话

bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
图片压缩了,,

既然知道原因了,,我改还不行么,,

废话不多说了,直接把代码贴过来,不难大家应该很容易就看懂了

package com.cuk.maskmanager.share;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.cuk.maskmanager.MainActivity;
import com.cuk.maskmanager.MallActivity;
import com.cuk.maskmanager.R;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

/**
 * 
 * 拍照页面
 * 
 * @author zz
 * 
 */
public class PhotoActivity extends Activity {

	private TextView mall, home;
	private String fileName_cle;
	private String fileName_dim;
	private Button but_photo_paizhao;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_photo);

		viewinit();
		topinit();

	}

	private void topinit() {
		mall = (TextView) findViewById(R.id.tv_sharetop_mall);
		home = (TextView) findViewById(R.id.tv_sharetop_home);
		mall.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Intent intent2 = new Intent(PhotoActivity.this,
						MallActivity.class);
				startActivity(intent2);

			}
		});
		home.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Intent intent2 = new Intent(PhotoActivity.this,
						MainActivity.class);
				startActivity(intent2);
				finish();
			}
		});
	}

	private void viewinit() {
		but_photo_paizhao = (Button) findViewById(R.id.but_photo_paizhao);
		but_photo_paizhao.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
				File out = new File(getPhotopath());
				fileName_cle = getPhotopath();
				Uri uri = Uri.fromFile(out);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//这里就是将原图保存下来
				startActivityForResult(intent, 2000);
			}
		});
	}

	/**
	 * 获取原图片存储路径
	 * 
	 * @return
	 */
	private String getPhotopath() {
		// 照片全路径
		String fileName = "";
		// 文件夹路径
		String pathUrl = Environment.getExternalStorageDirectory() + "/mymy/";
		String imageName = "imageTest.png";
		File file = new File(pathUrl);
		file.mkdirs();// 创建文件夹
		fileName = pathUrl + imageName;
		return fileName;
	}

	/**
	 * 根据路径获取图片资源(已缩放)
	 * 
	 * @param url
	 *            图片存储路径
	 * @param width
	 *            缩放的宽度
	 * @param height
	 *            缩放的高度
	 * @return
	 */
	private Bitmap getBitmapFromUrl(String url, double width, double height) {
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true; // 设置了此属性一定要记得将值设置为false
		Bitmap bitmap = BitmapFactory.decodeFile(url);
		// 防止OOM发生
		options.inJustDecodeBounds = false;
		int mWidth = bitmap.getWidth();
		int mHeight = bitmap.getHeight();
		Matrix matrix = new Matrix();
		float scaleWidth = 1;
		float scaleHeight = 1;
		// 按照固定宽高进行缩放
		// 这里希望知道照片是横屏拍摄还是竖屏拍摄
		// 因为两种方式宽高不同,缩放效果就会不同
		// 这里用了比较笨的方式
		if (mWidth <= mHeight) {
			scaleWidth = (float) (width / mWidth);
			scaleHeight = (float) (height / mHeight);
		} else {
			scaleWidth = (float) (height / mWidth);
			scaleHeight = (float) (width / mHeight);
		}
		// 按照固定大小对图片进行缩放
		matrix.postScale(scaleWidth, scaleHeight);
		Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, mWidth, mHeight,
				matrix, true);
		// 用完了记得回收
		bitmap.recycle();
		return newBitmap;
	}

	/**
	 * 存储缩放的图片
	 * 
	 * @param data
	 *            图片数据
	 */
	private void saveScalePhoto(Bitmap bitmap) {
		// 照片全路径
		String fileName = "";
		// 文件夹路径
		String pathUrl = Environment.getExternalStorageDirectory().getPath()
				+ "/mymy/";
		String imageName = "imageScale.png";
		FileOutputStream fos = null;
		File file = new File(pathUrl);
		file.mkdirs();// 创建文件夹
		fileName = pathUrl + imageName;
		fileName_dim = fileName;

		try {
			fos = new FileOutputStream(fileName);
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				fos.flush();
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 2000 && resultCode == Activity.RESULT_OK) {
			Bitmap bitmap = getBitmapFromUrl(getPhotopath(), 313.5, 462.0);
			saveScalePhoto(bitmap);
			Intent intent2 = new Intent(this, ShareActivity.class);
			intent2.putExtra("fileName_cle", fileName_cle);
			intent2.putExtra("fileName_dim", fileName_dim);
			startActivity(intent2);
			this.finish();
		}
	}
}

原理很简单,就是在拍照之后先保存即可,,

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值