拍照+剪裁+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();  
    }  
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 图片Bitmap的剪切

一、什么是Android中的Bitmap Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 二、

Bitmap,byte[],Drawable相互转化及拍照保存

Bitmap,byte[],Drawable相互转化及拍照保存

Android拍照后Bitmap内存溢出的解决办法

在安卓中拍照显示图片到指定的ImageView时候经常会使用Bitmap,但是Bitmap如果不及时回收会导致内存溢出的问题,所以在适合的时机回收bitmap很重要。否则拍了几张照片之后就会导致程序崩...

Android实现选择相册图片和拍照,并手动截图返回图片路径和Bitmap对象

直接贴代码: 不懂的地方可以联系我扣扣 1668126018 以下是几个类: 代码Copy可以直接用 记得加读写权限 package com.mcdemo.icon;import and...

Android基础——拍照获取图片、图库获取图片、截图功能、图片模糊问题、Uri为空处理、Uri与Bitmap转换

解决拍照获取图片、图库获取图片、截图功能、图片模糊问题、Uri为空处理、Uri与Bitmap转换 本篇文章实现的功能: 1、拍照获取图片后进行裁剪,裁剪成功并返回一个正确的文件Uri 2、从图库中...

处理相机拍照后Bitmap和图片旋转问题

在调用系统相机,拍照并保存在sdcard上后,有些图片

Android中从SD卡中/拍照选择图片并进行剪裁的方法

上一次的项目中,有填写用户信息,需要用到类似QQ头像选择的一个功能,让用户从手机图片或者自己拍照并图图像大小剪裁之后选择,当时觉得很实用,但是自己不知道怎么实现。最近参考同事写的代码并自己在网上查阅了...

android头像设置:从本地照片库或拍照获取并剪裁

功能介绍         制作android应用时,用户注册的功能必不可少,往往还需要具备用户头像的编辑功能,设置过程如下图:         界面设计...

Android中拍照和从相册选择图片,并剪裁(二)

从系统相册中选择照片或则调用系统相机。大部分的项目都会用到,我进行了一下封装,仿ios的效果。 效果如下: 1、Camera的基类 package com.zhang.test.pict...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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