欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android拍照裁剪图片

程序员文章站 2023-12-20 08:57:46
下面是效果图,看看是不是亲想要的效果图,如果是,这段代码你就可以参考下了,但是要灵活运用,根据需求做相应的改动。

下面是效果图,看看是不是亲想要的效果图,如果是,这段代码你就可以参考下了,但是要灵活运用,根据需求做相应的改动。

Android拍照裁剪图片

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
 <button
  android:id="@+id/take_photo"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="take photo" />
 <button
  android:id="@+id/get_photo"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="get photo" />
 <imageview
  android:id="@+id/picture"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal" />
</linearlayout>

package com.example.choosepictest;

import java.io.file;
import java.io.ioexception;
import android.app.activity;
import android.content.intent;
import android.graphics.bitmap;
import android.net.uri;
import android.os.bundle;
import android.os.environment;
import android.provider.mediastore;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.imageview;
public class mainactivity extends activity implements onclicklistener {
 public static final int take_photo = 1;
 public static final int crop_photo = 2;
 public static final int get_photo = 3;
 private button takephoto;
 private button getphoto;
 private imageview picture;
 private uri headimguri;
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  takephoto = (button) findviewbyid(r.id.take_photo);
  getphoto = (button) findviewbyid(r.id.get_photo);
  picture = (imageview) findviewbyid(r.id.picture);
  takephoto.setonclicklistener(this);
  getphoto.setonclicklistener(this);
 }
 @override
 public void onclick(view v) {
  switch (v.getid()) {
  case r.id.take_photo:
   takephoto();
   break;
  case r.id.get_photo:
   getphoto();
   break;
  default:
   break;
  }
 }
 // 拍照
 private void takephoto() {
  file appdir = new file(environment.getexternalstoragedirectory(),
    "/etoury/piccache");
  if (!appdir.exists()) {
   appdir.mkdir();
  }
  string filename = "user_head" + ".jpg";
  file outputimage = new file(appdir, filename);
  try {
   if (outputimage.exists()) {
    outputimage.delete();
   }
   outputimage.createnewfile();
  } catch (ioexception e) {
   e.printstacktrace();
  }
  headimguri = uri.fromfile(outputimage);
  intent intent = new intent("android.media.action.image_capture");
  intent.putextra(mediastore.extra_output, headimguri);
  startactivityforresult(intent, take_photo);
 }
 // 定向到图片库
 private void getphoto() {
  intent intent = new intent(intent.action_pick,
    android.provider.mediastore.images.media.external_content_uri);
  startactivityforresult(intent, get_photo);
 }
 /**
  * 裁剪
  */
 private void crop(uri uri) {
  // 裁剪图片意图
  intent intent = new intent("com.android.camera.action.crop");
  intent.setdataandtype(uri, "image/*");
  // 下面这个crop=true是设置在开启的intent中设置显示的view可裁剪
  intent.putextra("crop", "true");
  intent.putextra("scale", true);// 去黑边
  // 裁剪框的比例,1:1
  intent.putextra("aspectx", 1);// 输出是x方向的比例
  intent.putextra("aspecty", 1);
  // 裁剪后输出图片的尺寸大小,不能太大500程序崩溃
  intent.putextra("outputx", 256);
  intent.putextra("outputy", 256);
  // 图片格式
  /* intent.putextra("outputformat", "jpeg"); */
  intent.putextra("outputformat", bitmap.compressformat.jpeg.tostring());
  // intent.putextra("nofacedetection", true);// 取消人脸识别
  intent.putextra("return-data", true);// true:返回uri,false:不返回uri
  // 同一个地址下 裁剪的图片覆盖拍照的图片
  intent.putextra(mediastore.extra_output, headimguri);
  startactivityforresult(intent, crop_photo);
 }
 @override
 protected void onactivityresult(int requestcode, int resultcode, intent data) {
  switch (requestcode) {
  case get_photo:
   if (resultcode == result_ok) {
    crop(data.getdata());
   }
   break;
  case take_photo:
   if (resultcode == result_ok) {
    crop(headimguri);
   }
   break;
  case crop_photo:
   if (resultcode == result_ok) {
    bitmap cropbitmap = data.getparcelableextra("data");
    picture.setimagebitmap(cropbitmap);
   }
   break;
  default:
   break;
  }
 }
}

总结:

1.  拍照返回一张图片,可以是全尺寸的图片

2.  拍照返回图片的地址问题,一个目录下的一个文件

3. 裁剪的图片的地址, 覆盖了全尺寸图片的地址

4. 相册intent 返回的是一个uir , 不是string

5. 裁剪的图片,不能覆盖相册返回的uri(一定注意)

上一篇:

下一篇: