Android实现图片的裁剪(不调用系统功能)

接上一篇文章:Android实现图片区域裁剪功能

上一篇文章提及了通过调用系统相册或拍照来实现图片的缩放\裁剪。不过这对于笔者项目的要求同样不适合,笔者需要的是通过对手机屏幕整个进行一个截图,并对这个截图进行裁剪操作。

依靠系统功能确实可以实现图片的裁剪,但是不够灵活。这里笔者提供一种较为灵活的做法。

但是这种做法的用户体验没有上篇文章的好,至于使用何种方法,读者应该自己衡量。

同样,我们先看实际效果图。

这里展示的是笔者项目的一小部分(阅读器):

我们点击左下角的剪切按钮

我们通过红色边框的四个角来控制裁剪的大小,移动红色框体来控制裁剪的位置区域。

接下来我们看看源码的实现:

首先点击剪切按钮的时候,我们应该生成一个Bitmap对象,传递给另一个Activty处理

具体做法如下:

cutP.setOnClickListener(new View.OnClickListener() { 

   public void onClick(View v) {
    //将一些按钮隐藏
    cutP.setVisibility(View.INVISIBLE);
    mTopBarSwitcher.setVisibility(View.INVISIBLE);
    mPageSlider.setVisibility(View.INVISIBLE);
    back.setVisibility(View.INVISIBLE);
    mPageNumberView.setVisibility(View.INVISIBLE);
    View view = MuPDFActivity.this.getWindow().getDecorView();
    if (false == view.isDrawingCacheEnabled()) {
     view.setDrawingCacheEnabled(true);
    }
    Bitmap bitmap = view.getDrawingCache();
    ImageView imgv = new ImageView(MuPDFActivity.this);
    imgv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
      LayoutParams.FILL_PARENT-200));
    imgv.setImageBitmap(bitmap);
    backBitmap = bitmap;
    //传递给另一个Activity进行裁剪
    Intent intent = new Intent();
    intent.setClass(MuPDFActivity.this, CutActivity.class);
    startActivity(intent); 

   } 

  });

Tips:这里笔者是将这个截取的Bitmap对象传递给另一个Actvity做相关处理,这里如何在Activity之间进行Bitmap传递呢?这里我们简单的运用java语法特性来完成具体做法如下:

我们在ActvityA中有一个public static Bitmap bitmap对象,当ActivityA跳转到B时,我们直接通过ActivityA.bitmap来获取这个对象。

之后就是如何进行裁剪的操作了。操作在另一个Activity中进行。XML配置文件信息如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >
 <com.artifex.mupdf.Crop_Canvas
  android:id="@+id/myCanvas"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="#313131"
  />
 <Button
  android:id="@+id/cutCancel"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:text="取消"
  android:layout_alignParentBottom="true"
  android:layout_alignParentLeft="true"/>
 <Button
  android:id="@+id/cutEnsure"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:text="确定"
  android:layout_alignParentBottom="true"
  android:layout_centerInParent="true"/>
 <Button
  android:id="@+id/toPDF"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="ToPDF"
  android:layout_alignParentBottom="true"
  android:layout_alignParentRight="true"/>
</RelativeLayout>

通过配置文件可以看到我们自定义了一个View(ImageView)其实现如下:

package com.artifex.mupdf; 

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView; 

public class Crop_Canvas extends ImageView { 

 private final static int PRESS_LB = 0;//表示左下角矩形框
 private final static int PRESS_LT = 1;//表示左上角矩形框
 private final static int PRESS_RB = 2;//表示右下角矩形框
 private final static int PRESS_RT = 3;//表示右上角矩形框 

 private Bitmap bitMap = null;    //原始图片
 private RectF src = null;     //经过比例转换后的裁剪区域
 private RectF dst = null;     //图片显示区域,也就是drawBitmap函数中的目标dst
 private RectF ChooseArea = null;    //选择区域
 private Paint mPaint = null;    //画笔
 private Matrix matrix = null;    //矩阵 

 private int mx = 0;       //存储触笔移动时,之前�?��的触笔的x坐标
 private int my = 0;       //存储触笔移动时,之前�?��的触笔的y坐标
 private boolean touchFlag = false;   //触笔是否在屏幕之�?
 private boolean cutFlag = false;   //是否点击了menu上的裁剪按钮
 private int recFlag = -1;     //用来存储触笔点击了哪个小矩形框(改变选择区域大小的小矩形框)
 private boolean firstFlag = false; 

 private RectF recLT = null;     //左上角的小矩形框
 private RectF recRT = null;     //右上角的小矩形框
 private RectF recLB = null;     //左下角的小矩形框
 private RectF recRB = null;     //右下角的小矩形框
 private static final int LEFT_AREA_ALPHA = 50 * 255 / 100;
 private RectF leftRectL = null;
 private RectF leftRectR = null;
 private RectF leftRectT = null;
 private RectF leftRectB = null;
 private Paint leftAreaPaint = null; 

 public Crop_Canvas(Context context, AttributeSet attrs) {
  super(context, attrs);
  this.init();
 } 

 public Crop_Canvas(Context context) {
  super(context);
  this.init();
 } 

 public void init(){
  cutFlag = true;
  recLT = new RectF();
  recLB = new RectF();
  recRT = new RectF();
  recRB = new RectF();
  dst = new RectF();
  mPaint = new Paint();
  mPaint.setColor(Color.RED);
  mPaint.setStyle(Paint.Style.STROKE);  //将画笔的风格改为空心
  ChooseArea = new RectF();
  this.setPressRecLoc();
  src = null;
  firstFlag = true; 

  //选择框之外的灰色区域,分成四个矩形框 

  leftAreaPaint = new Paint();
  leftAreaPaint.setStyle(Paint.Style.FILL);
  leftAreaPaint.setAlpha(Crop_Canvas.LEFT_AREA_ALPHA);
 } 

 public void setBitmap(Bitmap bitmap){
  BitmapDrawable bd = new BitmapDrawable(bitmap);
  src = new RectF(0,0,bd.getIntrinsicWidth(),bd.getIntrinsicHeight());
  this.bitMap = bitmap.copy(Config.ARGB_8888, true); 

  this.setImageBitmap(bitMap);
  leftRectB = new RectF();
  leftRectL = new RectF();
  leftRectR = new RectF();
  leftRectT = new RectF();
 } 

 public void imageScale(){
  matrix = this.getImageMatrix();
  matrix.mapRect(dst, src);
  int padding = this.getPaddingBottom();
  int width = bitMap.getWidth();
  int height = bitMap.getHeight();
  //dst.set(dst.left+padding,dst.top+padding,dst.right+padding,dst.bottom+padding);
  dst.set(dst.left+20,dst.top+20,width-20,height - 40);
  ChooseArea = new RectF(dst);
  this.setPressRecLoc();
 } 

 public Bitmap getSubsetBitmap(){
  float ratioWidth = bitMap.getWidth()/(float)(dst.right-dst.left);
  float ratioHeight = bitMap.getHeight()/(float)(dst.bottom - dst.top);
  int left = (int)((ChooseArea.left - dst.left) * ratioWidth);
  int right = (int)(left + (ChooseArea.right - ChooseArea.left) * ratioWidth);
  int top = (int)((ChooseArea.top - dst.top) * ratioHeight);
  int bottom = (int)(top + (ChooseArea.bottom - ChooseArea.top) * ratioHeight);
  src = new RectF(left,top,right,bottom);
  firstFlag = true;
  set_LeftArea_Alpha();
  return Bitmap.createBitmap(bitMap, left, top, right-left, bottom-top);
 } 

 //获得ChooseArea对象
 public RectF getChooseArea(){
  return ChooseArea;
 } 

 public void moveChooseArea(int move_x,int move_y){
  if(ChooseArea.left + move_x >= dst.left && ChooseArea.right + move_x <= dst.right
  && ChooseArea.top + move_y >= dst.top && ChooseArea.bottom + move_y <= dst.bottom){
   ChooseArea.set(ChooseArea.left + move_x,ChooseArea.top+move_y
     ,ChooseArea.right + move_x,ChooseArea.bottom+move_y);
  }else{
   if(ChooseArea.left + move_x < dst.left){
    ChooseArea.set(dst.left,ChooseArea.top
      ,ChooseArea.right+dst.left-ChooseArea.left,ChooseArea.bottom);
   }
   if(ChooseArea.right + move_x > dst.right){
    ChooseArea.set(ChooseArea.left+dst.right-ChooseArea.right,ChooseArea.top
      ,dst.right,ChooseArea.bottom);
   } 

   if(ChooseArea.top + move_y < dst.top){
    ChooseArea.set(ChooseArea.left,dst.top
      ,ChooseArea.right,ChooseArea.bottom+dst.top-ChooseArea.top);
   } 

   if(ChooseArea.bottom + move_y > dst.bottom){
    ChooseArea.set(ChooseArea.left,ChooseArea.top+dst.bottom-ChooseArea.bottom
      ,ChooseArea.right,dst.bottom);
   }
  }
  this.setPressRecLoc();
  mPaint.setColor(Color.GREEN);
  this.invalidate();
 } 

 public boolean onTouchEvent(MotionEvent event){
  mPaint.setColor(Color.RED); 

  if(event.getAction() == MotionEvent.ACTION_DOWN && cutFlag){
   //System.out.println(event.getX() + "," + event.getY()); 

   mx = (int)event.getX();
   my = (int)event.getY();
   if(this.judgeLocation(mx,my)){
    touchFlag = true;
    mPaint.setColor(Color.GREEN);
    this.invalidate();
    return true;
   }else{ 

    if(this.findPresseddst((int)event.getX(), (int)event.getY())){
     touchFlag = true;
     mPaint.setColor(Color.RED);
     return true;
    }
   }
  } 

  if(event.getAction() == MotionEvent.ACTION_MOVE && touchFlag){
   //判断是否点击了哪个个小矩形框
   if(this.isOutOfArea((int)event.getX(), (int)event.getY())){
    return true;
   } 

   //如果选择区域大小跟图像大小一样时,就不能移动
   if(ChooseArea.left == dst.left && ChooseArea.top == dst.top &&
    ChooseArea.right == dst.right && ChooseArea.bottom == dst.bottom){
   }else{
    this.moveChooseArea((int)event.getX() - mx, (int)event.getY() - my);
    mx = (int)event.getX();
    my = (int)event.getY();
   }
  } 

  if(event.getAction() == MotionEvent.ACTION_UP){
   recFlag = -1;
   this.invalidate();
   touchFlag = false;
  } 

  return super.onTouchEvent(event);
 } 

 private boolean isOutOfArea(int x,int y){
  switch(recFlag){
  case Crop_Canvas.PRESS_LB:
   this.pressLB(x - mx, y - my);
   break;
  case Crop_Canvas.PRESS_LT:
   this.pressLT(x - mx, y - my);
   break;
  case Crop_Canvas.PRESS_RB:
   this.pressRB(x - mx, y - my);
   break;
  case Crop_Canvas.PRESS_RT:
   this.pressRT(x - mx, y - my);
   break;
  default:return false;
  }
  mx = x;
  my = y;
  this.invalidate();
  return true;
 } 

 public boolean findPresseddst(int x,int y){
  boolean returnFlag = false;
  if(this.isInRect(x, y, recLB)){
   recFlag = Crop_Canvas.PRESS_LB;
   returnFlag = true;
  }else if(this.isInRect(x, y, recLT)){
   recFlag = Crop_Canvas.PRESS_LT;
   returnFlag = true;
  }else if(this.isInRect(x, y, recRB)){
   recFlag = Crop_Canvas.PRESS_RB;
   returnFlag = true;
  }else if(this.isInRect(x, y, recRT)){
   recFlag = Crop_Canvas.PRESS_RT;
   returnFlag = true;
  } 

  return returnFlag;
 } 

 public boolean isInRect(int x,int y,RectF rect){
  if(x >= rect.left -20 && x <= rect.right + 20 && y > rect.top - 20 && y < rect.bottom + 20){
   return true;
  }
  return false;
 } 

 private void pressLB(int x,int y){
  float left = ChooseArea.left + x;
  float right = ChooseArea.right;
  float top = ChooseArea.top;
  float bottom = ChooseArea.bottom + y;
  if(left <= right - 30 && left >= dst.left && bottom <= dst.bottom && bottom >= top + 30){
    ChooseArea.set(left,top,right,bottom);
  }else{
   if(left + x < dst.left){
    left = dst.left;
   } 

   if(bottom + y > dst.bottom){
    bottom = dst.bottom;
   } 

   if(ChooseArea.left + x > ChooseArea.right - 30){
    left = ChooseArea.right - 30;
   } 

   if(ChooseArea.bottom + y < ChooseArea.top + 30){
    bottom = ChooseArea.top + 30;
   }
   ChooseArea.set(left,top,right,bottom);
  }
  this.setPressRecLoc();
 } 

 private void pressLT(int x,int y){
  float left = ChooseArea.left + x;
  float right = ChooseArea.right;
  float top = ChooseArea.top + y;
  float bottom = ChooseArea.bottom;
  if(left <= right - 30 && left >= dst.left && top <= bottom - 30 && top >= dst.top){
   ChooseArea.set(left,top,right,bottom);
  }else{
   if(left < dst.left){
    left = dst.left;
   } 

   if(top < dst.top){
    top = dst.top;
   } 

   if(left > right - 30){
    left = right - 30;
   } 

   if(top > bottom - 30){
    top = bottom - 30;
   }
   ChooseArea.set(left,top,right,bottom);
  }
  this.setPressRecLoc();
 } 

 private void pressRT(int x,int y){
  float left = ChooseArea.left;
  float right = ChooseArea.right + x;
  float top = ChooseArea.top + y;
  float bottom = ChooseArea.bottom; 

  if(right <= dst.right && right >= left + 30 && top <= bottom - 30 && top >= dst.top){
   ChooseArea.set(left,top,right,bottom);
  }else{
   if(right > dst.right){
    right = dst.right;
   } 

   if(top < dst.top){
    top = dst.top;
   } 

   if(right < left + 30){
    right = left + 30;
   } 

   if(top > bottom - 30){
    top = bottom - 30;
   }
   ChooseArea.set(left,top,right,bottom);
  }
  this.setPressRecLoc();
 } 

 private void pressRB(int x,int y){
  float left = ChooseArea.left;
  float right = ChooseArea.right + x;
  float top = ChooseArea.top;
  float bottom = ChooseArea.bottom + y; 

  if(right<= dst.right && right >= left + 30 && bottom <= dst.bottom && bottom >= top + 30){
   ChooseArea.set(left,top,right,bottom);
  }else{
   if(right > dst.right){
    right = dst.right;
   } 

   if(bottom > dst.bottom){
    bottom = dst.bottom;
   } 

   if(right < left + 30){
    right = left + 30;
   } 

   if(bottom < top + 30){
    bottom = top + 30;
   }
   ChooseArea.set(left,top,right,bottom);
  }
  this.setPressRecLoc();
 } 

 //每次改变选择区域矩形的大小或者移动,各角落上的小矩形也要改变它的Location
 private void setPressRecLoc(){
  recLT.set(ChooseArea.left-5,ChooseArea.top-5 , ChooseArea.left+5, ChooseArea.top+5);
  recLB.set(ChooseArea.left-5,ChooseArea.bottom-5 , ChooseArea.left+5, ChooseArea.bottom+5);
  recRT.set(ChooseArea.right-5,ChooseArea.top-5 , ChooseArea.right+5, ChooseArea.top+5);
  recRB.set(ChooseArea.right-5,ChooseArea.bottom-5 , ChooseArea.right+5, ChooseArea.bottom+5);
 } 

 public boolean judgeLocation(float x,float y){
  float start_x = this.getChooseArea().left;
  float start_y = this.getChooseArea().top;
  float last_x = this.getChooseArea().right;
  float last_y = this.getChooseArea().bottom;
  //System.out.println("chubi:" + x + "," + y);
  //System.out.println(start_y + "," + last_y);
  if(x > start_x+10 && x < last_x-10 && y > start_y+10 && y < last_y-10){
   return true;
  }
  return false;
 } 

 public void onDraw(Canvas canvas){
  super.onDraw(canvas);
  if(firstFlag){
   this.imageScale();
   firstFlag = false;
   mPaint.setColor(Color.RED);
   System.out.println("Width: " + (dst.right - dst.left));
   System.out.println("Height: " + (dst.bottom - dst.top));
   System.out.println("Width: " + this.getDrawable().getIntrinsicWidth());
   System.out.println("Height: " + this.getDrawable().getIntrinsicHeight());
  }else{
   set_LeftArea_Alpha();
  }
  canvas.drawRect(ChooseArea, mPaint);
  mPaint.setColor(Color.BLUE);
  canvas.drawRect(recLT, mPaint);
  canvas.drawRect(recLB, mPaint);
  canvas.drawRect(recRT, mPaint);
  canvas.drawRect(recRB, mPaint); 

  canvas.drawRect(leftRectL, leftAreaPaint);
  canvas.drawRect(leftRectR, leftAreaPaint);
  canvas.drawRect(leftRectT, leftAreaPaint);
  canvas.drawRect(leftRectB, leftAreaPaint); 

 } 

 public void set_LeftArea_Alpha(){
  leftRectL.set(dst.left, dst.top, ChooseArea.left, dst.bottom);
  leftRectR.set(ChooseArea.right,dst.top,dst.right,dst.bottom);
  leftRectT.set(ChooseArea.left, dst.top, ChooseArea.right, ChooseArea.top);
  leftRectB.set(ChooseArea.left,ChooseArea.bottom,ChooseArea.right,dst.bottom);
 }
}

接下来直接看看Activity源码:

package com.artifex.mupdf.cut; 

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList; 

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button; 

import com.andorid.shu.love.R;
import com.artifex.mupdf.Crop_Canvas;
import com.artifex.mupdf.MuPDFActivity; 

public class CutActivity extends Activity {
 private Crop_Canvas canvas = null;
 private Bitmap backBitmap;
 private Button cancel;
 private Button ensure;
 private Button toPDF; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.cut_image);
  backBitmap = MuPDFActivity.backBitmap;
  init();
  cancel = (Button) findViewById(R.id.cutCancel);
  cancel.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View v) {
    CutActivity.this.finish();
   }
  });
  ensure = (Button) findViewById(R.id.cutEnsure);
  ensure.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    //图片保存的路径,之后将之转换为PDF,并以附件的形似发送邮件
    File tmp = new File("/sdcard/lovereader/pic");
    tmp.mkdirs();
    File f = new File("/sdcard/lovereader/pic/" + "testpic" + ".png");
    try {
     f.createNewFile();
    } catch (IOException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
    FileOutputStream fOut = null;
    try {
      fOut = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    canvas.getSubsetBitmap().compress(Bitmap.CompressFormat.PNG, 100, fOut);
    try {
      fOut.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      fOut.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
   }
  }); 

  toPDF = (Button)findViewById(R.id.toPDF);
  toPDF.setOnClickListener(new OnClickListener() { 

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    ArrayList<String> imageUrllist = new ArrayList<String>();
    imageUrllist.add("/sdcard/lovereader/pic/" + "testpic" + ".png");
    String pdfUrl = "/sdcard/lovereader/tmp/Foreverlove.pdf";
    File tmp = new File("/sdcard/lovereader/tmp");
    tmp.mkdirs();
    File file = PdfManager.Pdf(imageUrllist, pdfUrl);
    try {
     file.createNewFile();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 

   }
  });
 } 

 private void init() {
  canvas = (Crop_Canvas) findViewById(R.id.myCanvas);
  Bitmap bitmap = backBitmap;
  canvas.setBitmap(bitmap);
 } 

}

ok,不依靠系统的简单裁剪功能就实现了,这里笔者就不给出源代码下载了,上述代码读者只要自己改改就可以用了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android调用系统裁剪的实现方法

    Android调用系统裁剪,这个已经使用的很熟悉了.但是近期项目里使用的时候遇到了一些小问题,所以在此整理一下,以作记录. 首先看代码: Intent intent1 = new Intent("com.android.camera.action.CROP"); intent1.setDataAndType(Uri.fromFile(new File(image.path)), "image/*"); intent1.putExtra("crop"

  • Android图片裁剪功能实现代码

    在Android应用中,图片裁剪也是一个经常用到的功能.Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的手机可能表现出不同的效果,甚至在某些奇葩手机上还会出其他更奇怪的问题,所以调用系统功能进行图片裁剪在很多时候对我们来说并不是一个好的选择.这时候就需要我们自己去实现这种裁剪功能了. 功能分析 要完成图片裁剪的功能,我们需要先知道图片裁剪的功能有哪些.图片裁剪之前,我们需要有一个框指示我们需要裁剪的样式合大小.图片显示出来后大小和位置可能并不是我们所期望的,所以我们还需

  • Android裁剪图像实现方法示例

    本文实例讲述了Android裁剪图像实现方法.分享给大家供大家参考,具体如下: package com.xiaoma.piccut.demo; import java.io.File; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.B

  • Android编程实现调用系统图库与裁剪图片功能

    本文实例讲述了Android编程实现调用系统图库与裁剪图片功能.分享给大家供大家参考,具体如下: 在Android开发中,调用系统图库和裁剪照片是很常见的需求.相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等.因此,对于一般的需求,建议直接调用系统的功能,简便高效! 首先上效果图:    一.只调用系统图库(不裁剪),返回用户选择的图片.(只支持单选,如需多选则需要自己实现,可参考Android编程实现仿QQ照片选择器(按相册分类显示,多选添加)源码.

  • Android实现图片的裁剪(不调用系统功能)

    接上一篇文章:Android实现图片区域裁剪功能 上一篇文章提及了通过调用系统相册或拍照来实现图片的缩放\裁剪.不过这对于笔者项目的要求同样不适合,笔者需要的是通过对手机屏幕整个进行一个截图,并对这个截图进行裁剪操作. 依靠系统功能确实可以实现图片的裁剪,但是不够灵活.这里笔者提供一种较为灵活的做法. 但是这种做法的用户体验没有上篇文章的好,至于使用何种方法,读者应该自己衡量. 同样,我们先看实际效果图. 这里展示的是笔者项目的一小部分(阅读器): 我们点击左下角的剪切按钮 我们通过红色边框的四

  • Android实现图片区域裁剪功能

    今天做的就是关于实现图片的区域裁剪功能.由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现"图片"裁剪(一个页面理解为一张图片).笔者对着方面是一点儿也不熟悉,因此就得上网查资料了.之后笔者找到了Android可以通过调用系统相册.拍照实现图片的裁剪.缩放功能. 这一过程就像是在某个应用中上传头像,并对头像进行调整.现做一个记录与分享. 首先我们还是来看看实际的效果图吧! 一开始的界面: 接下来: 看看实际实现区域裁剪的效果吧?需要注意的是这是系统自带的功能来实现的.

  • Android实现图片裁剪和上传

    本文实例为大家分享了Android实现图片的裁剪和上传的具体代码,供大家参考,具体内容如下 1.开发工具与关键技术:Eclipse.AndroidStudio2.撰写时间:2020年06月18日 接着上一次,调用系统的相机.上一次,我们已经拿到了图片的uri.接下来,就要进行图片的裁剪和上传啦!其实图片的裁剪和上传比较简单.如何简单呢?好,我们来看代码. 1.首先,配置maven,这里是使用uCrop裁剪图片 //图像裁剪 , 需要先配置 maven { url "https://jitpack

  • Android获取照片、裁剪图片、压缩图片

    前言 在做上一个项目时深深受到了图片上传的苦恼.图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照获取.第二个部分才是上传图片,两个部分都是走了不少弯路.由于Android系统的碎片化比较严重,我们可能出现在第一台机子上能获取图片,但是换一个机子就不能获取图片的问题,并且在Android6.0,7.0之后也要做一定的适配,这样对于开发者来说,无疑很蛋疼.由于也是初学者,很多东西没有考虑到,适配起来也是有点难度的. 这几天也是从github上找到了一个库(地址在这Tak

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】

    本文实例讲述了Android编程图片操作类定义与用法.分享给大家供大家参考,具体如下: 主界面类:拍照及选择相册图片 import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import androi

  • Android 以任意比例裁剪图片代码分享

    公司的一个小伙伴写的,可以按照任意比例裁剪图片.我觉得挺好用的.简单在这里记录一下,以后肯定还会用到. public class SeniorCropImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnLayoutChangeListener { /* For drawing color field start */ private static final int

  • Android编程图片加载类ImageLoader定义与用法实例分析

    本文实例讲述了Android编程图片加载类ImageLoader定义与用法.分享给大家供大家参考,具体如下: 解析: 1)图片加载使用单例模式,避免多次调用时产生死锁 2)核心对象 LruCache 图片加载时先判断缓存里是否有图片,如果有,就使用缓存里的 没有就加载网络的,然后置入缓存 3)使用了线程池ExecutorService mThreadPool技术 4)使用了Semaphore 信号来控制变量按照先后顺序执行,避免空指针的问题 如何使用: 在Adapter里加载图片时 复制代码 代

  • android获取图片尺寸的两种方式及bitmap的缩放操作

    我就废话不多说了,大家还是直接看代码吧~ //Uri.parse("file://"+result.getImage().getCompressPath())) String path=uri.getPath(); Log.e("图片路径",path+""); SpannableString spannableString=new SpannableString(path); //方法一:通过uri把图片转化为bitmap的方法 Bitmap b

  • 详解Android GLide图片加载常用几种方法

    目录 缓存浅析 GLide图片加载方法 图片加载周期 图片格式(Bitmap,Gif) 缓存 集成网络框架 权限 占位符 淡入效果 变换 启动页/广告页 banner 固定宽高 圆角 圆形 总结 缓存浅析 为啥要做缓存? android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了 防止内存溢出 ,应该将图片缓存起来. 图片的三级缓存分别是: 1.内存缓存 2.本地缓存 3.网络缓存 其中,内存缓存应优先加载,它速度最快:本地缓存次优先加载,它速度也快:网络缓存不应该优先加载,它

随机推荐