android实现图片裁剪的两种方法
作者:kcl5715305 发布时间:2022-10-27 18:41:05
标签:android,图片裁剪
两种android图片裁剪方式,供大家参考,具体内容如下
一、相机拍完照之后利用系统自带裁剪工具进行截取
public static void cropImage(Activity activity, Uri srcUri) {
cropImageUri = srcUri;
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(srcUri, "image/*");
intent.putExtra("crop", "true");
// 1.宽高和比例都不设置时,裁剪框可以自行调整(比例和大小都可以随意调整)
////////////////////////////////////////////////////////////////
// 2.只设置裁剪框宽高比(aspect)后,裁剪框比例固定不可调整,只能调整大小
////////////////////////////////////////////////////////////////
// 3.裁剪后生成图片宽高(output)的设置和裁剪框无关,只决定最终生成图片大小
////////////////////////////////////////////////////////////////
// 4.裁剪框宽高比例(aspect)可以和裁剪后生成图片比例(output)不同,此时,
// 会以裁剪框的宽为准,按照裁剪宽高比例生成一个图片,该图和框选部分可能不同,
// 不同的情况可能是截取框选的一部分,也可能超出框选部分,向下延伸补足
////////////////////////////////////////////////////////////////
// aspectX aspectY 是裁剪框宽高的比例
// intent.putExtra("aspectX", 1);
// intent.putExtra("aspectY", 1);
// // outputX outputY 是裁剪后生成图片的宽高
// intent.putExtra("outputX", 300);
// intent.putExtra("outputY", 300);
// return-data为true时,会直接返回bitmap数据,但是大图裁剪时会出现问题,推荐下面为false时的方式
// return-data为false时,不会返回bitmap,但需要指定一个MediaStore.EXTRA_OUTPUT保存图片uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri);
intent.putExtra("return-data", false);
activity.startActivityForResult(intent, CROP_IMAGE);
}
这样图片可以通过手势来自由裁剪
二、自定义相机拍照界面,裁剪固定区域的图片
这里用到了一个叫idcardcamera的三方,在此向原作者致敬,附上项目引用地址 ‘com.github.wildma:IDCardCamera:1.0.0'
有几个地方,需要修改一下,我是在相机中间加了一个长方形的框,代码片段如下:
float screenMinSize = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);
//根据screenMinSize,计算出cameraPreview的较宽的一边,长宽比为标准的16:9
float maxSize = screenMinSize / 9.0f * 16.0f;
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams((int) maxSize, (int) screenMinSize);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
mCameraPreview.setLayoutParams(layoutParams);
float height = (int) (screenMinSize * 0.3);
float density = getResources().getDisplayMetrics().density; // 屏幕密度(0.75 / 1.0 / 1.5)
float mywdith =(int) 136*density;
int widthPixels = getResources().getDisplayMetrics().widthPixels;
float width = (int) (widthPixels-mywdith);//75 47
LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams((int) width, ViewGroup.LayoutParams.MATCH_PARENT);
LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height);
mLlCameraCropContainer.setLayoutParams(containerParams);
mIvCameraCrop.setLayoutParams(cropParams);
修改了 mIvCameraCrop的大小,给这个长方形框添加一个背景边框,刚开始老是显示不出来右边的边框,后来发现,拍照按钮父布局的宽度为136dp,用代码计算出实际占用的px,然后设置长方形的合适宽度,这样就遮挡不住了,右边的边框就能够显示出来了,附上拍照的逻辑,选择自动剪裁
/**
* 拍照
*/
private void takePhoto() {
mCameraPreview.setEnabled(false);
mCameraPreview.takePhoto(new Camera.PictureCallback() {
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
// camera.stopPreview();
camera.startPreview();
//子线程处理图片,防止ANR
// setCropLayout();
new Thread(new Runnable() {
@Override
public void run() {
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
String imagePath = path;
ImageUtils.save(bitmap, imagePath, Bitmap.CompressFormat.JPEG);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int angle = ImageUtils.getBitmapDegree(imagePath);
if (mOrientation==90){
bitmap = ImageUtils.rotateBitmap(CameraActivity.this.bitmap, 180);
}
/**
* 计算裁剪位置
*/
float left, top, right, bottom;
left = ((float) mLlCameraCropContainer.getLeft() - (float) mCameraPreview.getLeft()) / (float) mCameraPreview.getWidth();
top = (float) mIvCameraCrop.getTop() / (float) mCameraPreview.getHeight();
right = (float) mLlCameraCropContainer.getRight() / (float) mCameraPreview.getWidth();
bottom = (float) mIvCameraCrop.getBottom() / (float) mCameraPreview.getHeight();
/**
* 自动裁剪
**/
mCropBitmap = Bitmap.createBitmap(bitmap,
(int) (left * (float) bitmap.getWidth()),
(int) (top * (float) bitmap.getHeight()),
(int) ((right - left) * (float) bitmap.getWidth()),
(int) ((bottom - top) * (float) bitmap.getHeight()));
/**
* 手动裁剪
**/
runOnUiThread(new Runnable() {
@Override
public void run() {
//将裁剪区域设置成与扫描框一样大
setCropLayout();
mCropImageView.setLayoutParams(new LinearLayout.LayoutParams(mIvCameraCrop.getWidth(), mIvCameraCrop.getHeight()));
mCropImageView.setImageBitmap( mCropBitmap);
}
});
}
}).start();
safeToTakePicture = true;
}
});
}
来源:https://blog.csdn.net/kcl5715305/article/details/99860009


猜你喜欢
- 本文实例讲述了Android播放assets文件里视频文件相关问题。分享给大家供大家参考,具体如下:今天做了一个功能,就是播放项目工程里面的
- 本文实例讲述了Android基于ViewPager实现的应用欢迎界面。分享给大家供大家参考,具体如下:有时候开发一个应用需要指导用户提示一些
- Bezier Curve算法是根据参数曲线方程来得到光滑曲线的一种算法,曲线方程的参数由控制点决定。其本质是由调和函数根据控制点插值而成,其
- 一、常见场景1、ThreadLocal作为线程上下文副本,那么一种最常见的使用方式就是用来方法隐式传参,通过提供的set()和get()两个
- Android开发中少不了真机调试,总用数据线 * 拔拔的还是不方便也不稳定,其实可以实现WIFI的方式连接android手机。 &
- SqlMapConfig.xml的约束,也就是Mybatis主配置文件的约束<?xml version="1.0"
- 与链表、堆栈和队列不一样,二叉查找树不是线性数据结构,是二维数据结构。每个节点都包含一个LeftNode和RightNode,二叉查找树把比
- 基本功能刚拿到需求,很简单的一个功能,二话不说,很快就出来了:完美!顺利上线!没过几天领导拿着手机过来说:“这一堆数字在一起看着很费劲,像其
- Intellij IDEA 配置Subversion插件实现步骤详解在使用Intellij的过程中,突然发现svn不起效了,在VCS–》Ch
- 1.MediaCodec 是什么MediaCodec类可以访问底层媒体编解码器框架(StageFright 或 OpenMAX),即编解码组
- 目录1.概览2.自定义枚举方法3.使用 == 比较枚举类型4.在 switch 语句中使用枚举类型5.枚举类型的属性,方法和构造函数6.En
- 用Java来实现简单的拼图游戏,供大家参考,具体内容如下首先我们看一下这个拼图小游戏的效果图:创建一个名称为MedleyGame的类,该类继
- 首先备注一下JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE
- 如下:public static void CreateConfig(){ //c#可以添加内置的app.conf
- MyBatis动态sql动态sql处理简单的多参数查询常用标签标签说明if条件判断,与java中的if语句类似where为sql语句动态添加
- 目录知识点介绍正文1、质量压缩2、采样率压缩3、缩放法压缩4、RGB_565 通过改变图片格式来实现压缩总结知识点介绍Android 中图片
- Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型)。
- 深色主题工具类package com.example.kotlindemo.utilsimport android.content.Cont
- 1 前言到目前为止Java仍然是使用最多的编程语言,随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,
- 一、AQS介绍队列同步器AbstractQueuedSynchronizer(简称AQS),AQS定义了一套多线程访问共享资源的同步器框架,