Android开发实践:自己动手编写图片剪裁应用(3)

简介:
  1. 打开图片


图片的打开主要是把各种格式的图片转换为Bitmap对象,Android通过BitmapFactory类提供了一系列的静态方法来协助完成这个操作,如下所示:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  BitmapFactory {
     public  static  Bitmap decodeFile(String pathName, Options opts);
     public  static  Bitmap decodeFile(String pathName);
     public  static  Bitmap decodeResourceStream(Resources res, TypedValue value,
             InputStream is, Rect pad, Options opts) ;
     public  static  Bitmap decodeResource(Resources res,  int  id, Options opts) ;
     public  static  Bitmap decodeResource(Resources res,  int  id);
     public  static  Bitmap decodeByteArray( byte [] data,  int  offset,  int  length, Options opts);
     public  static  Bitmap decodeByteArray( byte [] data,  int  offset,  int  length);
     public  static  Bitmap decodeStream(InputStream is, Rect outPadding, Options opts);
     public  static  Bitmap decodeStream(InputStream is) ;
     public  static  Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts);
     public  static  Bitmap decodeFileDescriptor(FileDescriptor fd) ;
}

通过这些静态方法,我们可以方便地从文件、资源、字节流等各种途径打开图片,生成Bitmap对象。下面给出一个从文件中打开图片的函数封装:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  static  Bitmap load( String filepath ) {
 
     Bitmap bitmap =  null ;
     try  {
         FileInputStream fin =  new  FileInputStream(filepath);
         bitmap = BitmapFactory.decodeStream(fin);
         fin.close();
     }
     catch  (FileNotFoundException e) {
             
    
     catch  (IOException e) {
                 
     }
     return  bitmap;
}


2. 保存图片


图片的保存则主要通过Bitmap的compress方法,该方法的原型如下:


1
2
3
4
5
6
7
8
9
10
11
/**
   * Write a compressed version of the bitmap to the specified outputstream.    
   * @param format   The format of the compressed image
   * @param quality  Hint to the compressor, 0-100. 0 meaning compress for
   *                 small size, 100 meaning compress for max quality. Some
   *                 formats, like PNG which is lossless, will ignore the
   *                 quality setting
   * @param stream   The outputstream to write the compressed data.
   * @return true if successfully compressed to the specified stream.
   */
public  boolean  compress(CompressFormat format,  int  quality, OutputStream stream)

第一个参数是图片格式,只有JPEG、PNG和WEBP三种,第二个参数是压缩质量(0~100),数值越大图片信息损失越小,第三个参数则是文件流对象。


同样,这里给出一个保存图片的函数封装:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  void  save( Bitmap bitmap, String filepath ) {
     try  {
         FileOutputStream fos =  new  FileOutputStream(filepath);
         bitmap.compress(CompressFormat.JPEG,  100 , fos);              
         bitmap.recycle();            
         fos.close();            
      }
      catch  (FileNotFoundException e) {
            
     
      catch  (IOException e) {      
             
      }   
  }


3. 剪裁图片


Android中剪裁图片主要有2种方法,一种通过Bitmap的createBitmap方法来生成剪裁的图片,另一种则是通过Canvas对象来“绘制”新的图片,这里先给出代码,再分析:


1
2
3
4
5
6
7
8
9
10
11
public  static  Bitmap crop( Bitmap bitmap, Rect cropRect ) {
     return  Bitmap.createBitmap(bitmap,cropRect.left,cropRect.top,cropRect.width(),cropRect.height());
}
     
public  static  Bitmap cropWithCanvas( Bitmap bitmap, Rect cropRect ) {
     Rect destRect =  new  Rect( 0 , 0 ,cropRect.width(),cropRect.height());
     Bitmap cropped = Bitmap.createBitmap(cropRect.width(),cropRect.height(),Bitmap.Config.RGB_565);
     Canvas canvas =  new  Canvas(cropped);        
     canvas.drawBitmap(bitmap,cropRect,destRect, null );
     return  cropped;
}


其实第一种方法内部实现也是利用了Canvas对象来“绘制”新的图片的,Canvas对象通过一个Bitmap对象来构建,该Bitmap即为“画布”,drawBitmap则是将源bitmap对象“画”到“画布”之中,这样就实现了数据的搬移,实现了图片的剪裁。


4. 旋转图片


Android中旋转图片同样是通过Bitmap的createBitmap方法来生成旋转后的图片,不过图片的旋转需要借助Matrix对象来协助完成,代码如下:


1
2
3
4
5
public  static  Bitmap rotate( Bitmap bitmap,  int  degrees  ) {
     Matrix matrix =  new  Matrix();
     matrix.postRotate(degrees);            
     return  Bitmap.createBitmap(bitmap, 0 , 0 ,bitmap.getWidth(),bitmap.getHeight(),matrix, true );
}


当然,图片的旋转也是可以通过Canvas来“绘制”,由于图片旋转会导致边界坐标发生变化,所以需要以图片中心点坐标为中心来旋转,具体实现见如下代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public  static  Bitmap rotateWithCanvas( Bitmap bitmap,  int  degrees  ) {
         
     int  destWidth,destHeight;
         
     float  centerX = bitmap.getWidth()/ 2 ;
     float  centerY = bitmap.getHeight()/ 2 ;        
         
     // We want to do the rotation at origin, but since the bounding
     // rectangle will be changed after rotation, so the delta values
     // are based on old & new width/height respectively.
     Matrix matrix =  new  Matrix();        
     matrix.preTranslate(-centerX,-centerY);
     matrix.postRotate(degrees);        
     if ( degrees/ 90 % 2  ==  0  ) { 
         destWidth  = bitmap.getWidth();
         destHeight = bitmap.getHeight();
         matrix.postTranslate(centerX,centerY);
     }        
     else  {            
         destWidth  = bitmap.getHeight();
         destHeight = bitmap.getWidth();
         matrix.postTranslate(centerY,centerX);            
     }
     Bitmap cropped = Bitmap.createBitmap(destWidth,destHeight,Bitmap.Config.RGB_565);
     Canvas canvas =  new  Canvas(cropped);       
     canvas.drawBitmap(bitmap, matrix,  null );
     return  cropped;
}


本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1604074,如需转载请自行联系原作者

相关文章
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
1天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
1天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第24天】随着移动开发技术的不断演进,提升应用性能和用户体验已成为开发者的核心任务。在Android平台上,Kotlin语言凭借其简洁性和功能性成为主流选择之一。特别是Kotlin的协程功能,它为异步编程提供了一种轻量级的解决方案,使得处理并发任务更加高效和简洁。本文将深入探讨Kotlin协程在Android开发中的应用,通过实际案例分析协程如何优化应用性能,以及如何在项目中实现协程。
|
2天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
6 0
Android系统 应用存储路径与权限
|
2天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
16 0
|
7天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
5 0
|
7天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
11 0
|
27天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。