解决调用系统拍照保存的图片被压缩的问题
来源:互联网 发布:vmware tools下载mac 编辑:程序博客网 时间:2024/06/13 21:40
这几天在做微信分享,要求实现拍照分享的功能。本想用网上的方法调用系统的相机然后拍照保存就可以了,没想到保存后的图片是压缩过的。没办法,自己动手吧。
研究一阵子后发现原来原因就是这句话
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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void onClick(View arg0) {Intent intent2 = new Intent(PhotoActivity.this,MallActivity.class);startActivity(intent2);}});home.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic 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; // 设置了此属性一定要记得将值设置为falseBitmap 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();}}}@Overrideprotected 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 0
- 解决调用系统拍照保存的图片被压缩的问题
- 解决android调用系统相机拍照保存时onActivityResult中data为null的问题
- 安卓调用系统相机拍照,并把图片保存到SD卡中 进行 尺寸和质量的压缩
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- 解决通过Intent调用系统拍照程序,返回图片太小的问题
- 解决通过Intent调用系统拍照程序,返回图片太小的问题
- 解决通过Intent调用系统拍照程序,返回图片太小的问题
- 解决通过Intent调用系统拍照程序,返回图片太小的问题[android]
- 解决三星调用系统相机拍照显示图片旋转90度横着的问题
- 图片压缩保存 处理三星拍照图片旋转问题的部分方法
- Intent调用系统的拍照保存原图
- 关于调用系统拍照返回图片报错的问题
- android调用系统相机的方法,并且解决三星手机遇到的问题,图片旋转、压缩
- 完美调用系统相机拍照,获取图片进行压缩并本地保存
- MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题
- 调用系统摄像头拍照,对拍照后的图片进行裁剪和压缩处理,并显示在imageview上面
- Android解决部分机型获取不到系统拍照图片,图库图片问题的解决
- Android 拍照并显示在ImageView中(解决图片压缩失真的问题)
- SPI驱动分析
- poj 1185 炮兵阵地 【状压DP】
- MFC中获得编辑框中指定的某一行的字符内容
- 代理模式-Proxy Pattern
- Canvas读书笔记之基础
- 解决调用系统拍照保存的图片被压缩的问题
- Linux服务之httpd基本配置详解
- C++ set map list的正确删除元素方法
- HDU-2544-最短路-单源最短路+Dijkstra算法
- 使用正则表达式限制文本框输入格式
- MySQL执行计划解读
- 上李邕(yong1)
- 请教如何在数据绑定时不让combox控件触发SelectedIndexChanged事件,
- HDU 5325 Crazy Bobo(思路+dfs 记忆化)