自定义裁剪类CropImageView:

package top.lc951.myandroid.views;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;import top.lc951.myandroid.utils.BitmapUtil;/*** @author lichong* 2022年07月26日19:48:17*/
public class CropImageView extends View {private Paint mPaintShade;private Bitmap mOrigBitmap=null;private Bitmap mCropBitmap=null;private Rect mRect=new Rect(0,0,0,0);public CropImageView(Context context) {this(context,null);}public CropImageView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mPaintShade=new Paint();mPaintShade.setColor(0x99000000);}public void setOriginBitmap(Bitmap origin){mOrigBitmap=origin;}public Bitmap getCropBitmap(){return mCropBitmap;}public boolean setBitmapRect(Rect rect){if(null==mOrigBitmap){return false;}else if(rect.left<0 || rect.left>mOrigBitmap.getWidth()){return false;}else if(rect.top < 0 || rect.top > mOrigBitmap.getHeight()){return false;}else if (rect.right <= 0 || rect.left + rect.right > mOrigBitmap.getWidth()) { // 右侧边界非法return false;} else if (rect.bottom <= 0 || rect.top + rect.bottom > mOrigBitmap.getHeight()) { // 下方边界非法return false;}mRect = rect;// 根据指定的四周边界,裁剪相应尺寸的位图对象mCropBitmap = Bitmap.createBitmap(mOrigBitmap,mRect.left, mRect.top, mRect.right, mRect.bottom);postInvalidate(); // 立即刷新视图(线程安全方式)return true;}// 获取位图的矩形边界public Rect getBitmapRect() {return mRect;}// 左右翻转图像public void flip() {// 水平翻转图像,也就是把镜中像左右翻过来mCropBitmap = BitmapUtil.getFlipBitmap(mCropBitmap);postInvalidate(); // 立即刷新视图(线程安全方式)}// 在下级视图都绘制完成后触发@Overrideprotected void dispatchDraw(Canvas canvas) {if (mOrigBitmap == null) {return;}// 画外圈阴影Rect rectShade = new Rect(0, 0, getMeasuredWidth(), getMeasuredHeight());canvas.drawRect(rectShade, mPaintShade);// 画高亮处的图像canvas.drawBitmap(mCropBitmap, mRect.left, mRect.top, new Paint());}}

布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".activity.BitmapCutActivity"><TextViewapp:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:id="@+id/tv_label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dp"android:text="请选择剪裁方式:"android:textColor="@color/black"android:textSize="17sp"/><Spinnerapp:layout_constraintStart_toEndOf="@id/tv_label"app:layout_constraintTop_toTopOf="parent"app:layout_constraintEnd_toEndOf="parent"android:id="@+id/spinner"android:layout_width="0dp"android:layout_height="wrap_content"android:spinnerMode="dropdown" /><ImageViewandroid:id="@+id/iv_origin"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/tv_label"android:layout_width="match_parent"android:layout_height="300dp"android:src="@mipmap/ic_img06"android:scaleType="fitXY"android:layout_margin="10dp"/><top.lc951.myandroid.views.CropImageViewandroid:id="@+id/iv_crop"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintTop_toTopOf="@id/iv_origin"app:layout_constraintStart_toStartOf="@id/iv_origin"app:layout_constraintEnd_toEndOf="@id/iv_origin"app:layout_constraintBottom_toBottomOf="@id/iv_origin"android:background="@color/transparent"/><Buttonandroid:id="@+id/btn_save_image"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="保存图片"android:textColor="@color/black"android:textSize="17sp"app:layout_constraintTop_toBottomOf="@id/iv_origin"app:layout_constraintStart_toStartOf="parent"/><ImageViewandroid:id="@+id/iv_new"android:layout_width="match_parent"android:layout_height="200dp"android:scaleType="centerInside"app:layout_constraintTop_toBottomOf="@id/btn_save_image"app:layout_constraintStart_toStartOf="parent"/></android.support.constraint.ConstraintLayout>

应用:

package top.lc951.myandroid.activity;import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;import top.lc951.myandroid.R;
import top.lc951.myandroid.utils.BitmapUtil;
import top.lc951.myandroid.views.CropImageView;/*** 图片裁剪*/
public class BitmapCutActivity extends AppCompatActivity {private CropImageView cropImageView;private ImageView originIv;private ImageView newIv;public static void actionActivity(Context context) {Intent intent = new Intent(context, BitmapCutActivity.class);context.startActivity(intent);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_bitmap_cut);bindViews();initSpinner();}private String[] array = {"不裁剪", "中间", "左上角", "右上角", "左下角", "右下角"};private void initSpinner() {ArrayAdapter<String> colorAdapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, array);Spinner spinner = findViewById(R.id.spinner);spinner.setAdapter(colorAdapter);spinner.setSelection(0);spinner.setPrompt("请选择裁剪区域");spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {cropImageView.setVisibility(position == 0 ? View.GONE : View.VISIBLE);Bitmap bitmap = originIv.getDrawingCache();int width = bitmap.getWidth(), height = bitmap.getHeight();cropImageView.setOriginBitmap(bitmap);switch (position) {case 1:cropImageView.setBitmapRect(new Rect(width/4, height/4, width/2, height/2));break;case 2:cropImageView.setBitmapRect(new Rect(0, 0, width/2, height/2));break;case 3:cropImageView.setBitmapRect(new Rect(width/2, 0, width/2, height/2));break;case 4:cropImageView.setBitmapRect(new Rect(0, height/2, width/2, height/2));break;case 5:cropImageView.setBitmapRect(new Rect(width/2, height/2, width/2, height/2));break;}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});}private void bindViews() {cropImageView = findViewById(R.id.iv_crop);originIv = findViewById(R.id.iv_origin);newIv = findViewById(R.id.iv_new);originIv.setDrawingCacheEnabled(true);// 开启位图视图的绘图缓存originIv.setImageResource(R.mipmap.ic_img06);new Handler(Looper.myLooper()).postDelayed(new Runnable() {@Overridepublic void run() {initSpinner();}}, 200);Button saveBtn = findViewById(R.id.btn_save_image);saveBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {cropImageView.setVisibility(View.GONE);Bitmap bitmap = cropImageView.getCropBitmap();newIv.setImageBitmap(bitmap);// 生成图片文件的保存路径
//                String path = String.format("%s/%s.jpg",
//                        getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(),
//                        DateUtil.getNowDateTime());
//                BitmapUtil.saveImage(path, bitmap); // 把位图保存为图片文件
//                BitmapUtil.notifyPhotoAlbum(BitmapCutActivity.this, path); // 通知相册来了张新图片
//                Toast.makeText(BitmapCutActivity.this, "成功保存图片文件:" + path, Toast.LENGTH_SHORT).show();}});}
}

【Android】Bitmap图片裁剪(91/100)相关推荐

  1. Android大图片裁剪终极解决方案 原理分析

    约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏 ...

  2. android 自定义图片裁剪,Android图片裁剪工具封装

    笔者从零开始开发Android,而且是跳过java直接使用kotlin开发,这其中的好处是可以避开java这门传统语言诸多的潜规则,难处是相比资深Android开发者少了许多可以现用的工具库.比如An ...

  3. android 自定义图片裁剪,uCrop介绍,我们自己的安卓版图片裁剪库

    在Yalantis,我们开发了许多不同的安卓app,根据我们的经验来看,几乎每个我们开发的应用都需要图片裁剪的功能.图片裁剪可以用于很多目的,从普通到头像调整到按比例裁剪以及图片变换等更复杂的功能. ...

  4. Android—Bitmap图片大小计算、压缩与三级缓存

    Bitmap对象占用内存大小: bitmap.getByteCount() 图片所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数. Android Bitmap使用的三种颜色格 ...

  5. android:图片裁剪

    图片裁剪: public class MainActivity extends Activity {public final int START_CAMERA_RESULT = 1;public fi ...

  6. Android BitMap图片压缩

    最近在网上看了一些关于图片压缩的博客,自己也动手实验了一遍,也算事对图片压缩有了一个了解,打算写个博客记录一下.文末附上参考链接. Android中涉及到图片的话一般都会用到BitMap类和Bitma ...

  7. android 调用图片裁剪功能,Android图片裁剪,合成(调用系统裁剪功能)

    做照片相框 步骤就是跟美图秀秀一样,先截图,然后添加相框 在之前Bitmap.createBitmap那个文里,说过使用jpg图片会挡住底层图片,用画这种方法合成图片,没有问题. public cla ...

  8. Android bitmap图片处理

    一.View转换为Bitmap         在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面.在窗口显示的时候Android会把这些控件都加载到内存中 ...

  9. Android大图片裁剪之手机拍照和从相册中选择注意点

    Intent("com.android.camera.action.CROP"):中data.MediaStore.EXTRA_OUTPUT以及return-data data:P ...

最新文章

  1. matlab ros 手势识别,使用MATLAB读取分析ros记录的.bag文件
  2. tf.data.Dataset.from_tensor_slices 的用法
  3. (转载)你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句...
  4. 算法 | 一段C语言和汇编的对应分析,揭示函数调用的本质
  5. 201521145048《Java程序设计管理》第一周学习总结
  6. Mr.J-- jQuery学习笔记(五)--属性及属性节点
  7. Android 8.0学习(16)---8.0 的Doze模式白名单路径
  8. Python递归函数的正确理解与使用
  9. list control 应用(转载)
  10. 苹果手机如何减少后台流量
  11. CSS3中很容易混淆的transform,translate,transition。如何去区分,以及综合写法。
  12. Android 代码混淆之部分类不混淆的技巧
  13. 利用ArcGIS Python批量拼接遥感影像(arcpy batch processing)
  14. 原理图与 PCB 绘制备忘
  15. 【计算视觉】人体姿态识别研究综述(详细归纳!)
  16. #高等数学# 第八章 微分方程
  17. 地图上如何量方位角_正距方位图是怎么画出来的?应该怎么看?有什么特点?...
  18. 英语之境(chapter two)
  19. 诺基亚仍质疑谷歌Android 暂不加入OHA联盟
  20. 提示格式化怎么办,提示格式化找到方案

热门文章

  1. 有故事的网页设计——Flash网站奇妙之旅
  2. Elasticsearch全文检索:根据关键词对全文查询检索,关键词也分词处理
  3. 「Python海龟画图」利用海龟画笔绘制六芒星阵
  4. 计算机毕业设计项目大全
  5. 72年属鼠48岁有一灾2020_72鼠2020运势运程如何 48岁有一灾是真的吗
  6. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(二)
  7. RSTP协议原理与配置整——RSTP对STP的改进
  8. 巴特沃斯滤波器matlab代码,MATLAB实现巴特沃斯数字滤波器
  9. Cloudreve免费安卓客户端
  10. 自己编写itoa 函数