Android中几种图像特效处理的集锦

大家好,这一节给大家分享的是Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等.

废话少说了,直接讲解今天的实例,本例主要是先获取壁纸(getWallpaper()),然后对当前壁纸的一些特效处理.大家按步骤一步一步来:

第一步:新建一个Android工程命名为ImageDemo,工程结构如下:

 

第二步:新建一个.java文件,命名为ImageUtil.java,在里面定义一些图片处理方法,代码如下:

 

  1. package  com.android.tutor;   
  2. import  android.graphics.Bitmap;   
  3. import  android.graphics.Canvas;   
  4. import  android.graphics.LinearGradient;   
  5. import  android.graphics.Matrix;   
  6. import  android.graphics.Paint;   
  7. import  android.graphics.PixelFormat;   
  8. import  android.graphics.PorterDuffXfermode;   
  9. import  android.graphics.Rect;   
  10. import  android.graphics.RectF;   
  11. import  android.graphics.Bitmap.Config;   
  12. import  android.graphics.PorterDuff.Mode;   
  13. import  android.graphics.Shader.TileMode;   
  14. import  android.graphics.drawable.Drawable;   
  15. public   class  ImageUtil {   
  16.        
  17.      //放大缩小图片   
  18.      public   static  Bitmap zoomBitmap(Bitmap bitmap, int  w, int  h){   
  19.          int  width = bitmap.getWidth();   
  20.          int  height = bitmap.getHeight();   
  21.         Matrix matrix =  new  Matrix();   
  22.          float  scaleWidht = (( float )w / width);   
  23.          float  scaleHeight = (( float )h / height);   
  24.         matrix.postScale(scaleWidht, scaleHeight);   
  25.         Bitmap newbmp = Bitmap.createBitmap(bitmap,  0 0 , width, height, matrix,  true );   
  26.          return  newbmp;   
  27.     }   
  28.      //将Drawable转化为Bitmap   
  29.       public   static  Bitmap drawableToBitmap(Drawable drawable){   
  30.              int  width = drawable.getIntrinsicWidth();   
  31.              int  height = drawable.getIntrinsicHeight();   
  32.             Bitmap bitmap = Bitmap.createBitmap(width, height,   
  33.                     drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888   
  34.                             : Bitmap.Config.RGB_565);   
  35.             Canvas canvas =  new  Canvas(bitmap);   
  36.             drawable.setBounds( 0 , 0 ,width,height);   
  37.             drawable.draw(canvas);   
  38.              return  bitmap;   
  39.                
  40.         }   
  41.         
  42.       //获得圆角图片的方法   
  43.      public   static  Bitmap getRoundedCornerBitmap(Bitmap bitmap, float  roundPx){   
  44.            
  45.         Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap   
  46.                 .getHeight(), Config.ARGB_8888);   
  47.         Canvas canvas =  new  Canvas(output);   
  48.     
  49.          final   int  color =  0xff424242 ;   
  50.          final  Paint paint =  new  Paint();   
  51.          final  Rect rect =  new  Rect( 0 0 , bitmap.getWidth(), bitmap.getHeight());   
  52.          final  RectF rectF =  new  RectF(rect);   
  53.     
  54.         paint.setAntiAlias( true );   
  55.         canvas.drawARGB( 0 0 0 0 );   
  56.         paint.setColor(color);   
  57.         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);   
  58.     
  59.         paint.setXfermode( new  PorterDuffXfermode(Mode.SRC_IN));   
  60.         canvas.drawBitmap(bitmap, rect, rect, paint);   
  61.     
  62.          return  output;   
  63.     }   
  64.      //获得带倒影的图片方法   
  65.      public   static  Bitmap createReflectionImageWithOrigin(Bitmap bitmap){   
  66.          final   int  reflectionGap =  4 ;   
  67.          int  width = bitmap.getWidth();   
  68.          int  height = bitmap.getHeight();   
  69.            
  70.         Matrix matrix =  new  Matrix();   
  71.         matrix.preScale( 1 , - 1 );   
  72.            
  73.         Bitmap reflectionImage = Bitmap.createBitmap(bitmap,    
  74.                  0 , height/ 2 , width, height/ 2 , matrix,  false );   
  75.            
  76.         Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/ 2 ), Config.ARGB_8888);   
  77.            
  78.         Canvas canvas =  new  Canvas(bitmapWithReflection);   
  79.         canvas.drawBitmap(bitmap,  0 0 null );   
  80.         Paint deafalutPaint =  new  Paint();   
  81.         canvas.drawRect( 0 , height,width,height + reflectionGap,   
  82.                 deafalutPaint);   
  83.            
  84.         canvas.drawBitmap(reflectionImage,  0 , height + reflectionGap,  null );   
  85.            
  86.         Paint paint =  new  Paint();   
  87.         LinearGradient shader =  new  LinearGradient( 0 ,   
  88.                 bitmap.getHeight(),  0 , bitmapWithReflection.getHeight()   
  89.                 + reflectionGap,  0x70ffffff 0x00ffffff , TileMode.CLAMP);   
  90.         paint.setShader(shader);   
  91.          // Set the Transfer mode to be porter duff and destination in   
  92.         paint.setXfermode( new  PorterDuffXfermode(Mode.DST_IN));   
  93.          // Draw a rectangle using the paint with our linear gradient   
  94.         canvas.drawRect( 0 , height, width, bitmapWithReflection.getHeight()   
  95.                 + reflectionGap, paint);   
  96.     
  97.          return  bitmapWithReflection;   
  98.     }   
  99.        
  100. }  
  1. package  com.android.tutor;  
  2. import  android.graphics.Bitmap;  
  3. import  android.graphics.Canvas;  
  4. import  android.graphics.LinearGradient;  
  5. import  android.graphics.Matrix;  
  6. import  android.graphics.Paint;  
  7. import  android.graphics.PixelFormat;  
  8. import  android.graphics.PorterDuffXfermode;  
  9. import  android.graphics.Rect;  
  10. import  android.graphics.RectF;  
  11. import  android.graphics.Bitmap.Config;  
  12. import  android.graphics.PorterDuff.Mode;  
  13. import  android.graphics.Shader.TileMode;  
  14. import  android.graphics.drawable.Drawable;  
  15. public   class  ImageUtil {  
  16.       
  17.     //放大缩小图片   
  18.     public   static  Bitmap zoomBitmap(Bitmap bitmap, int  w, int  h){  
  19.         int  width = bitmap.getWidth();  
  20.         int  height = bitmap.getHeight();  
  21.         Matrix matrix = new  Matrix();  
  22.         float  scaleWidht = (( float )w / width);  
  23.         float  scaleHeight = (( float )h / height);  
  24.         matrix.postScale(scaleWidht, scaleHeight);  
  25.         Bitmap newbmp = Bitmap.createBitmap(bitmap, 00 , width, height, matrix,  true );  
  26.         return  newbmp;  
  27.     }  
  28.     //将Drawable转化为Bitmap   
  29.      public   static  Bitmap drawableToBitmap(Drawable drawable){  
  30.             int  width = drawable.getIntrinsicWidth();  
  31.             int  height = drawable.getIntrinsicHeight();  
  32.             Bitmap bitmap = Bitmap.createBitmap(width, height,  
  33.                     drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
  34.                             : Bitmap.Config.RGB_565);  
  35.             Canvas canvas = new  Canvas(bitmap);  
  36.             drawable.setBounds(0 , 0 ,width,height);  
  37.             drawable.draw(canvas);  
  38.             return  bitmap;  
  39.               
  40.         }  
  41.        
  42.      //获得圆角图片的方法   
  43.     public   static  Bitmap getRoundedCornerBitmap(Bitmap bitmap, float  roundPx){  
  44.           
  45.         Bitmap utput = Bitmap.createBitmap(bitmap.getWidth(), bitmap  
  46.                 .getHeight(), Config.ARGB_8888);  
  47.         Canvas canvas = new  Canvas(output);  
  48.    
  49.         final   int  color =  0xff424242 ;  
  50.         final  Paint paint =  new  Paint();  
  51.         final  Rect rect =  new  Rect( 00 , bitmap.getWidth(), bitmap.getHeight());  
  52.         final  RectF rectF =  new  RectF(rect);  
  53.    
  54.         paint.setAntiAlias(true );  
  55.         canvas.drawARGB(0000 );  
  56.         paint.setColor(color);  
  57.         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  58.    
  59.         paint.setXfermode(new  PorterDuffXfermode(Mode.SRC_IN));  
  60.         canvas.drawBitmap(bitmap, rect, rect, paint);  
  61.    
  62.         return  output;  
  63.     }  
  64.     //获得带倒影的图片方法   
  65.     public   static  Bitmap createReflectionImageWithOrigin(Bitmap bitmap){  
  66.         final   int  reflectionGap =  4 ;  
  67.         int  width = bitmap.getWidth();  
  68.         int  height = bitmap.getHeight();  
  69.           
  70.         Matrix matrix = new  Matrix();  
  71.         matrix.preScale(1 , - 1 );  
  72.           
  73.         Bitmap reflectionImage = Bitmap.createBitmap(bitmap,   
  74.                 0 , height/ 2 , width, height/ 2 , matrix,  false );  
  75.           
  76.         Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2 ), Config.ARGB_8888);  
  77.           
  78.         Canvas canvas = new  Canvas(bitmapWithReflection);  
  79.         canvas.drawBitmap(bitmap, 00null );  
  80.         Paint deafalutPaint = new  Paint();  
  81.         canvas.drawRect(0 , height,width,height + reflectionGap,  
  82.                 deafalutPaint);  
  83.           
  84.         canvas.drawBitmap(reflectionImage, 0 , height + reflectionGap,  null );  
  85.           
  86.         Paint paint = new  Paint();  
  87.         LinearGradient shader = new  LinearGradient( 0 ,  
  88.                 bitmap.getHeight(), 0 , bitmapWithReflection.getHeight()  
  89.                 + reflectionGap, 0x70ffffff0x00ffffff , TileMode.CLAMP);  
  90.         paint.setShader(shader);  
  91.         // Set the Transfer mode to be porter duff and destination in   
  92.         paint.setXfermode(new  PorterDuffXfermode(Mode.DST_IN));  
  93.         // Draw a rectangle using the paint with our linear gradient   
  94.         canvas.drawRect(0 , height, width, bitmapWithReflection.getHeight()  
  95.                 + reflectionGap, paint);  
  96.    
  97.         return  bitmapWithReflection;  
  98.     }  
  99.       
  100. }  

package com.android.tutor; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Bitmap.Config; import android.graphics.PorterDuff.Mode; import android.graphics.Shader.TileMode; import android.graphics.drawable.Drawable; public class ImageUtil { //放大缩小图片 public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){ int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidht = ((float)w / width); float scaleHeight = ((float)h / height); matrix.postScale(scaleWidht, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return newbmp; } //将Drawable转化为Bitmap public static Bitmap drawableToBitmap(Drawable drawable){ int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0,0,width,height); drawable.draw(canvas); return bitmap; } //获得圆角图片的方法 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap utput = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } //获得带倒影的图片方法 public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, height,width,height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } }

第三步:修改main.xml布局文件,主要放了两个ImageView控件,代码如下:

 

  1. <?xml version= "1.0"  encoding= "utf-8" ?>   
  2. <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"   
  3.     android:orientation= "vertical"   
  4.     android:layout_width= "fill_parent"   
  5.     android:layout_height= "fill_parent"   
  6.     >   
  7.     <ImageView    
  8.         android:id= "@+id/image01"     
  9.         android:layout_width= "wrap_content"     
  10.         android:layout_height= "wrap_content"     
  11.         android:padding= "10px"   
  12.         />   
  13.     <ImageView   
  14.         android:id= "@+id/image02"   
  15.         android:layout_width= "wrap_content"     
  16.         android:layout_height= "wrap_content"     
  17.         android:padding= "10px"   
  18.     />   
  19. </LinearLayout>  
  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >  
  7.     <ImageView   
  8.         android:id="@+id/image01"    
  9.         android:layout_width="wrap_content"    
  10.         android:layout_height="wrap_content"    
  11.         android:padding="10px"   
  12.         />  
  13.     <ImageView  
  14.         android:id="@+id/image02"   
  15.         android:layout_width="wrap_content"    
  16.         android:layout_height="wrap_content"    
  17.         android:padding="10px"   
  18.     />  
  19. </LinearLayout>  

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/image01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10px" /> <ImageView android:id="@+id/image02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10px" /> </LinearLayout>

第四步:修改主核心程序,ImageDemo.java,代码如下:

 

  1. package  com.android.tutor;   
  2. import  android.app.Activity;   
  3. import  android.graphics.Bitmap;   
  4. import  android.graphics.drawable.Drawable;   
  5. import  android.os.Bundle;   
  6. import  android.widget.ImageView;   
  7. public   class  Imagedemo  extends  Activity {   
  8.      private  ImageView mImageView01,mImageView02;   
  9.        
  10.      public   void  onCreate(Bundle savedInstanceState) {   
  11.          super .onCreate(savedInstanceState);   
  12.         setContentView(R.layout.main);   
  13.         setupViews();   
  14.     }   
  15.       
  16.      private   void  setupViews(){   
  17.         mImageView01 = (ImageView)findViewById(R.id.image01);   
  18.         mImageView02 = (ImageView)findViewById(R.id.image02);   
  19.            
  20.          //获取壁纸返回值是Drawable   
  21.         Drawable drawable = getWallpaper();   
  22.          //将Drawable转化为Bitmap   
  23.         Bitmap bitmap = ImageUtil.drawableToBitmap(drawable);   
  24.          //缩放图片   
  25.         Bitmap zoomBitmap = ImageUtil.zoomBitmap(bitmap,  100 100 );   
  26.          //获取圆角图片   
  27.         Bitmap roundBitmap = ImageUtil.getRoundedCornerBitmap(zoomBitmap,  10 .0f);   
  28.          //获取倒影图片   
  29.         Bitmap reflectBitmap = ImageUtil.createReflectionImageWithOrigin(zoomBitmap);   
  30.          //这里可以让Bitmap再转化为Drawable   
  31. //      Drawable roundDrawable = new BitmapDrawable(roundBitmap);          
  32. //      Drawable reflectDrawable = new BitmapDrawable(reflectBitmap);          
  33. //      mImageView01.setBackgroundDrawable(roundDrawable);   
  34. //      mImageView02.setBackgroundDrawable(reflectDrawable);   
  35.                    
  36.         mImageView01.setImageBitmap(roundBitmap);   
  37.         mImageView02.setImageBitmap(reflectBitmap);   
  38.     }   
  39.          
  40.           
  41. }  
  1. package  com.android.tutor;  
  2. import  android.app.Activity;  
  3. import  android.graphics.Bitmap;  
  4. import  android.graphics.drawable.Drawable;  
  5. import  android.os.Bundle;  
  6. import  android.widget.ImageView;  
  7. public   class  Imagedemo  extends  Activity {  
  8.     private  ImageView mImageView01,mImageView02;  
  9.       
  10.     public   void  onCreate(Bundle savedInstanceState) {  
  11.         super .onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         setupViews();  
  14.     }  
  15.      
  16.     private   void  setupViews(){  
  17.         mImageView01 = (ImageView)findViewById(R.id.image01);  
  18.         mImageView02 = (ImageView)findViewById(R.id.image02);  
  19.           
  20.         //获取壁纸返回值是Drawable   
  21.         Drawable drawable = getWallpaper();  
  22.         //将Drawable转化为Bitmap   
  23.         Bitmap bitmap = ImageUtil.drawableToBitmap(drawable);  
  24.         //缩放图片   
  25.         Bitmap zoomBitmap = ImageUtil.zoomBitmap(bitmap, 100100 );  
  26.         //获取圆角图片   
  27.         Bitmap roundBitmap = ImageUtil.getRoundedCornerBitmap(zoomBitmap, 10 .0f);  
  28.         //获取倒影图片   
  29.         Bitmap reflectBitmap = ImageUtil.createReflectionImageWithOrigin(zoomBitmap);  
  30.         //这里可以让Bitmap再转化为Drawable   
  31. //      Drawable roundDrawable = new BitmapDrawable(roundBitmap);          
  32. //      Drawable reflectDrawable = new BitmapDrawable(reflectBitmap);          
  33. //      mImageView01.setBackgroundDrawable(roundDrawable);   
  34. //      mImageView02.setBackgroundDrawable(reflectDrawable);   
  35.                   
  36.         mImageView01.setImageBitmap(roundBitmap);  
  37.         mImageView02.setImageBitmap(reflectBitmap);  
  38.     }  
  39.         
  40.          
  41. }  

package com.android.tutor; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.ImageView; public class Imagedemo extends Activity { private ImageView mImageView01,mImageView02; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupViews(); } private void setupViews(){ mImageView01 = (ImageView)findViewById(R.id.image01); mImageView02 = (ImageView)findViewById(R.id.image02); //获取壁纸返回值是Drawable Drawable drawable = getWallpaper(); //将Drawable转化为Bitmap Bitmap bitmap = ImageUtil.drawableToBitmap(drawable); //缩放图片 Bitmap zoomBitmap = ImageUtil.zoomBitmap(bitmap, 100, 100); //获取圆角图片 Bitmap roundBitmap = ImageUtil.getRoundedCornerBitmap(zoomBitmap, 10.0f); //获取倒影图片 Bitmap reflectBitmap = ImageUtil.createReflectionImageWithOrigin(zoomBitmap); //这里可以让Bitmap再转化为Drawable // Drawable roundDrawable = new BitmapDrawable(roundBitmap); // Drawable reflectDrawable = new BitmapDrawable(reflectBitmap); // mImageView01.setBackgroundDrawable(roundDrawable); // mImageView02.setBackgroundDrawable(reflectDrawable); mImageView01.setImageBitmap(roundBitmap); mImageView02.setImageBitmap(reflectBitmap); } }

第五步:运行上述工程,查看效果如下:

 

OK大功告成了!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值