拍照+剪裁+bitmap

原创 2013年12月03日 10:28:33

启动相机拍摄

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
//下面这句指定调用相机拍照后的照片存储的路径 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri .fromFile(
new File(Environment.getExternalStorageDirectory(),  "xiaoma.jpg"))); 
 裁剪图片方法实现 ,也是调用系统的Crop实现
 Intent intent = new Intent("com.android.camera.action.CROP"); 
 intent.setDataAndType(uri, "image/*"); 
//下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 
 intent.putExtra("crop", "true"); 
 // aspectX aspectY 是宽高的比例 
 intent.putExtra("aspectX", 1); 
 intent.putExtra("aspectY", 1); 
 // outputX outputY 是裁剪图片宽高 
 intent.putExtra("outputX", 150); 
 intent.putExtra("outputY", 150); 
 intent.putExtra("return-data", true); 
1.资源命名问题:不要以a开头,否侧经常会加载不到。
2.值拍照一次就立刻返回。

    在camera中,点击拍照调的是doAttach。后来查看源码,发现onPictureTaken里面有调用到doAttach,只是有个判断,mQuickCapture,原来是intent里面的一个boolean值,只是这个EXTRA_QUICK_CAPTURE是私有的变量,于是复制到需要的地方,直接加到intent里面,这样在onPictureTaken里面直接调用doAttach,达到目的。

3.当裁剪图片小于规定的大小时,会存在毛边

添加下面2个字段可以解决问题。

putExtra("scale", true)//黑边
putExtra("scaleUpIfNeeded", true)//黑边

剪裁图片成圆形

        /** 
         * 转换图片成圆形 
         * @param bitmap 传入Bitmap对象 
         * @return 
         */
        public Bitmap toRoundBitmap(Bitmap bitmap) { 
                int width = bitmap.getWidth(); 
                int height = bitmap.getHeight(); 
                float roundPx; 
                float left,top,right,bottom,dst_left,dst_top,dst_right,dst_bottom; 
                if (width <= height) { 
                        roundPx = width / 2; 
                        top = 0; 
                        bottom = width; 
                        left = 0; 
                        right = width; 
                        height = width; 
                        dst_left = 0; 
                        dst_top = 0; 
                        dst_right = width; 
                        dst_bottom = width; 
                } else { 
                        roundPx = height / 2; 
                        float clip = (width - height) / 2; 
                        left = clip; 
                        right = width - clip; 
                        top = 0; 
                        bottom = height; 
                        width = height; 
                        dst_left = 0; 
                        dst_top = 0; 
                        dst_right = height; 
                        dst_bottom = height; 
                } 
                  
                Bitmap output = Bitmap.createBitmap(width, 
                                height, Config.ARGB_8888); 
                Canvas canvas = new Canvas(output); 
                  
                final int color = 0xff424242; 
                final Paint paint = new Paint(); 
                final Rect src = new Rect((int)left, (int)top, (int)right, (int)bottom); 
                final Rect dst = new Rect((int)dst_left, (int)dst_top, (int)dst_right, (int)dst_bottom); 
                final RectF rectF = new RectF(dst); 
  
                paint.setAntiAlias(true); 
                  
                canvas.drawARGB(0, 0, 0, 0); 
                paint.setColor(color); 
//drawRoundRect用于画圆角矩形,第一个参数为显示区域,后面两个参数分别是水平圆角半径和垂直圆角半径
                canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
  
                paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
//从源图片裁剪显示挖取的图片
                canvas.drawBitmap(bitmap, src, dst, paint); 
                return output; 
        }

图片缩放

//按比例缩放图片
	private Bitmap scaleBtmap(Bitmap a, int width, int height) {
		// TODO Auto-generated method stub
		
		float scale_x = (float)width/a.getWidth();
		float scale_y = (float)height/a.getHeight();
		Matrix matrix = new Matrix();
		matrix.postScale(scale_x, scale_y);
		
		Bitmap aa = Bitmap.createBitmap(a, 0, 0, a.getWidth(), a.getHeight(), matrix, true);
		
		return aa;
	}

或者直接使用ThumbnailUtils类的静态方法
extractThumbnail(Bitmap,width,height,ThumbnailUtils.OPTIONS_RECYCLE_INPUT)方法
android.media.ThumbnailUtils提供了3个静态方法
   static Bitmap  createVideoThumbnail(String filePath, int kind)  //获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/android123.3gp,而第二个参数可以为MINI_KIND或MICRO_KIND最终和分辨率有关 
   static Bitmap  extractThumbnail(Bitmap source, int width, int height, int options)  //直接对Bitmap进行缩略操作,最后一个参数定义为OPTIONS_RECYCLE_INPUT ,来回收资源
   static Bitmap  extractThumbnail(Bitmap source, int width, int height) // 这个和上面的方法一样,无options选项

bitmap溢出问题

需要注意的是,由于bitmap占内存很大,注意释放和创建,以免出现内存溢出OOM。
1 bitmap如果不用了,回收掉
protected void onDestroy() {  
        super.onDestroy();  
        if(bmp1 != null){  
            bmp1.recycle();  
            bmp1 = null;  
        }  
        if(bmp2 != null){  
            bmp2.recycle();  
            bmp2 = null;  
        }  
    }  
2 先算出该bitmap的大小,然后通过调节采样率的方式来规避
BitmapFactory.Options opts = new BitmapFactory.Options();  
        opts.inJustDecodeBounds = true;  
        BitmapFactory.decodeFile(imageFile, opts);  
        opts.inSampleSize = computeSampleSize(opts, minSideLength, maxNumOfPixels);  
        opts.inJustDecodeBounds = false;  
        try {  
            return BitmapFactory.decodeFile(imageFile, opts);  
        } catch (OutOfMemoryError err) {  
        }  
        return null;  
3 在进行文件传输时,最好采用压缩的方式变成byte[]再传输
public static byte[] bitmap2Bytes(Bitmap bm) {  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.JPEG, 90, baos);  
        return baos.toByteArray();  
    }  

Okhttp实现上传图片

转载自 http://blog.csdn.net/ydxlt/article/details/48024017 可参照原文 给ImageView设置点击事件 在imageview的点击事...
  • liangjianing1121
  • liangjianing1121
  • 2017年10月14日 16:04
  • 214

安卓中上传头像的应用

在最近的项目中,要应用到上传头像。为了图省事在网上找了许多代码,结果发现并不适用与自己。干脆就自己写了一下。...
  • chenqi5256969
  • chenqi5256969
  • 2017年01月13日 15:21
  • 135

Android调用系统相机拍照后不进入预览确认

private static Intent getTakePhotoIntent(String fileName) { Intent intent = new Intent(MediaStore.AC...
  • tung214
  • tung214
  • 2014年05月07日 19:09
  • 3599

Android 图片Bitmap的剪切

一、什么是Android中的Bitmap Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 二、...
  • stop_pig
  • stop_pig
  • 2014年04月08日 19:14
  • 19490

按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片 返回Bitmap

/** * 按宽/高缩放图片到指定大小并进行裁剪得到中间部分图片 * 方 法 名:zoomBitmap * 创 建 人: * 创建时间:2016-6-7 下午12:02:52 ...
  • ZHOU452840622
  • ZHOU452840622
  • 2016年06月07日 13:53
  • 2518

C#图像处理——2(使用Bitmap类进行图片裁剪)

C# 使用Bitmap类进行图片裁剪    在Mapwin(手机游戏地图编辑器)生成的地图txt文件中添加自己需要处理的数据后转换成可在手机(Ophone)开发环境中使用的字节流地图文件的小工具,...
  • ryb666666
  • ryb666666
  • 2016年12月05日 09:46
  • 1685

Android开发技巧——大图裁剪

本篇内容是接上篇《Android开发技巧——定制仿微信图片裁剪控件》 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪。裁剪控件的简单使用XML代码使...
  • maosidiaoxian
  • maosidiaoxian
  • 2016年03月17日 12:07
  • 5167

Android大图片裁剪终极解决方案(上:原理分析)

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-)  http://blog.csdn.net/floodingfire/article/de...
  • floodingfire
  • floodingfire
  • 2012年11月03日 21:47
  • 42142

android 常用Bitmap处理方法收集:普通裁剪,缩放,圆形裁剪

代码是平常使用时收集的,并不是我本人所写。这些bitmap处理方法在我的android程序里面使用相对较多,希望对大家也有些帮助。 import android.graphics.Bitmap; im...
  • qq_27856623
  • qq_27856623
  • 2017年03月21日 11:21
  • 875

bitmap图片的裁剪

Bitmap 图片的裁剪     有一个需求,把图片显示在一个宽高比为1.5 : 1的ImageView中,提供的图片宽和高都是不一定的,有宽大于高的,也有高大于宽的,这就需要对图片裁剪。该方法符合宽...
  • yanxiangxue
  • yanxiangxue
  • 2017年01月11日 12:04
  • 140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:拍照+剪裁+bitmap
举报原因:
原因补充:

(最多只允许输入30个字)