这几天在做微信分享,要求实现拍照分享的功能。本想用网上的方法调用系统的相机然后拍照保存就可以了,没想到保存后的图片是压缩过的。没办法,自己动手吧。
研究一阵子后发现原来原因就是这句话
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();
}
}
}
原理很简单,就是在拍照之后先保存即可,,