热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现图片区域裁剪功能

这篇文章主要为大家详细介绍了Android实现图片区域裁剪功能,调用相册、拍照实现缩放、切割图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

今天做的就是关于实现图片的区域裁剪功能。由于项目功能的需要笔者需要实现PDF文档的阅读,并且就某个页面实现“图片”裁剪(一个页面理解为一张图片)。笔者对着方面是一点儿也不熟悉,因此就得上网查资料了。之后笔者找到了Android可以通过调用系统相册、拍照实现图片的裁剪、缩放功能。

这一过程就像是在某个应用中上传头像,并对头像进行调整。现做一个记录与分享。

首先我们还是来看看实际的效果图吧!

一开始的界面:            

接下来:

看看实际实现区域裁剪的效果吧?需要注意的是这是系统自带的功能来实现的。

如何实现的呢?源代码如下:

直接看Activity的代码,布局文件这里就不给出来了(比较简单,就一个button)

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.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
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.ImageButton; 
import android.widget.ImageView; 
/** 
 * 调用系统相册或者拍照来实现图片的裁剪、缩放 
 * @author Kiritor 
 **/ 
public class PicCutDemoActivity extends Activity { 
 
 private Button btn = null; 
 /** Called when the activity is first created. */ 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  //初始化 
  init(); 
 } 
  
 /** 
  * 初始化方法实现 
  */ 
 private void init() { 
  btn = (Button) findViewById(R.id.button1); 
  btn.setOnClickListener(new OnClickListener() { 
   @Override 
   public void onClick(View v) { 
    ShowPickDialog(); 
   } 
  }); 
 } 
 
  
 /** 
  * 控件点击事件实现 
  * 
  * 因为有朋友问不同控件的背景图裁剪怎么实现, 
  * 我就在这个地方用了三个控件,只为了自己记录学习 
  * 大家觉得没用的可以跳过啦 
  */ 
  
 
 /** 
  * 选择提示对话框 
  */ 
 private void ShowPickDialog() { 
  new AlertDialog.Builder(this) 
    .setTitle("设置头像...") 
    .setNegativeButton("相册", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
       
      Intent intent = new Intent(Intent.ACTION_PICK, null); 
       
      /** 
       * 下面这句话,与其它方式写是一样的效果,如果: 
       * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       * intent.setType(""image/*");设置数据类型 
       * 如果朋友们要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" 
       */ 
      intent.setDataAndType( 
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
        "image/*"); 
      startActivityForResult(intent, 1); 
 
     } 
    }) 
    .setPositiveButton("拍照", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      dialog.dismiss(); 
      Intent intent = new Intent( 
        MediaStore.ACTION_IMAGE_CAPTURE); 
      //下面这句指定调用相机拍照后的照片存储的路径 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri 
        .fromFile(new File(Environment 
          .getExternalStorageDirectory(), 
          "xiaoma.jpg"))); 
      startActivityForResult(intent, 2); 
     } 
    }).show(); 
 } 
 
 @Override 
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
  switch (requestCode) { 
  // 如果是直接从相册获取 
  case 1: 
   startPhotoZoom(data.getData()); 
   break; 
  // 如果是调用相机拍照时 
  case 2: 
   File temp = new File(Environment.getExternalStorageDirectory() 
     + "/test.jpg"); 
   startPhotoZoom(Uri.fromFile(temp)); 
   break; 
  // 取得裁剪后的图片 
  case 3: 
   if(data != null){ 
    setPicToView(data); 
   } 
   break; 
  default: 
   break; 
 
  } 
  super.onActivityResult(requestCode, resultCode, data); 
 } 
  
 /** 
  * 裁剪图片方法实现 
  * @param uri 
  */ 
 public void startPhotoZoom(Uri uri) { 
  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); 
  startActivityForResult(intent, 3); 
 } 
  
 /** 
  * 保存裁剪之后的图片数据 
  * @param picdata 
  */ 
 private void setPicToView(Intent picdata) { 
  Bundle extras = picdata.getExtras(); 
  if (extras != null) { 
   Bitmap photo = extras.getParcelable("data"); 
   Drawable drawable = new BitmapDrawable(photo); 
    
  } 
 } 
 
} 

Ok!一个简单的图片裁剪功能就完成了,完整的源码:Android实现图片裁剪功能

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


推荐阅读
  • 应对.avast后缀勒索病毒:全面指南
    本文详细介绍了.avast后缀勒索病毒的特性、感染途径、恢复方法及预防措施,旨在帮助用户有效应对这一威胁。 ... [详细]
  • 解决vCenter vSphere HA初始化失败的问题
    本文探讨了在集群中遇到的所有vSphere HA主机状态显示‘无法正确安装或配置vSphere HA代理’错误的情况,并详细介绍了排查与解决步骤,包括检查HA初始化错误及安装HA代理的常见故障排除方法。 ... [详细]
  • 在Windows Server 2008 R2上配置IIS FTP服务
    本文详细介绍了如何在Windows Server 2008 R2操作系统上通过IIS配置FTP服务的过程,包括服务器角色的选择与安装、FTP站点的创建以及必要的服务和防火墙设置检查。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • 本文介绍如何在Laravel框架中集成微信支付功能,包括如何配置微信支付环境、处理支付请求及接收支付回调等关键步骤。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 三菱PLC SLMP协议报文详解
    本文详细解析了三菱PLC中使用的SLMP协议报文结构,包括其工作原理、通信流程及报文格式,旨在帮助工程师和技术人员更好地理解和运用这一协议。 ... [详细]
  • 使用C# .NET构建UDP点对点聊天应用
    本文详细介绍如何利用C# .NET框架开发一个基于UDP协议的点对点聊天程序,包括客户端与服务器之间的连接建立、数据传输等核心功能。 ... [详细]
  • 本指南详细介绍了如何在同一台计算机上配置多个GitHub账户,并使用不同的SSH密钥进行身份验证,确保每个账户的安全性和独立性。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 2023年最佳PHP开发学习路径推荐
    本文详细探讨了针对不同背景的学习者如何选择最适合自己的PHP开发学习资源,包括书籍、在线课程及培训机构的推荐。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
author-avatar
双语的家_352
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有