`

【转】Android中几种图像特效处理方法小结

阅读更多

原文地址:http://www.androidmi.com/Androidkaifa/jinjie/201011/1788.html

作者的联系方式:

QQ:524509159
Email:hoohbood@gmail.com
Tel:18666294230

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

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

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

 

 

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

view plaincopy to clipboardprint?
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 output = 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;  
    }  
      

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 output = 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控件,代码如下:

view plaincopy to clipboardprint?
<?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> 
<?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,代码如下:

view plaincopy to clipboardprint?
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);  
    }  
        
         

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大功告成了!!

  • 大小: 18.5 KB
  • 大小: 24.4 KB
分享到:
评论

相关推荐

    android常用图片特效处理

    首先,我们要理解Android中处理图片的基础:Bitmap对象。Bitmap是Android系统用于表示图像数据的类,它包含了像素信息,可以进行各种图像操作。处理图片特效,通常需要先将图片加载为Bitmap对象。 1. **灰度处理**...

    Android 图像柔化美白特效源码.rar

    在Android平台上,图像处理是一个非常重要的领域,尤其在开发各种社交、美颜或者摄影类应用时,图像柔化和美白特效是不可或缺的功能。这个压缩包文件"Android 图像柔化美白特效源码.rar"很可能包含了实现这些效果的...

    Android对图片进行特效处理的代码例子

    模糊和锐化效果是图像处理的基本操作。模糊通常通过卷积滤波器实现,例如高斯模糊;而锐化则可能通过计算图像的拉普拉斯导数或差分来增强边缘。 黑白效果简单直接,只需将图像转换为灰度即可。Android提供了多种...

    安卓Android源码——常用图片特效处理.rar

    在安卓(Android)平台上,开发图像处理应用时,经常会涉及到各种图片特效的实现。这个压缩包"安卓Android源码——常用图片特效处理.rar"显然包含了用于处理图片特效的源代码,可以帮助开发者理解和学习如何在...

    Android代码-图像柔化美白特效源码.zip

    柔化特效通常涉及模糊处理,这在Android中可以使用Bitmap的`blur()`方法或renderscript的`BlurMaskFilter`来实现。模糊算法可能包含高斯模糊、均值模糊等,它们通过对图像像素的邻域进行平均来降低图像的细节,从而...

    Android中轴旋转特效实现,制作别样的图片浏览器

    本文将深入探讨如何在Android中实现轴旋转特效,以制作一个别样的图片浏览器。 首先,我们需要理解“中轴旋转”的概念。这是一种3D空间中的变换,物体绕着一个固定的点(即中轴)进行旋转。在Android中,我们可以...

    Android源码——图像连环画特效源码_new_38.zip

    研究这个源码,开发者可以学习如何在Android中实现复杂的图像处理特效,并将其应用到自己的项目中。 总的来说,"Android源码——图像连环画特效源码_new_38.zip"是一个宝贵的教育资源,它涵盖了Android图像处理的...

    Android 常用图片特效处理源码.zip

    首先,我们要明白Android中的图像处理涉及到的主要技术领域包括位图操作、色彩空间转换、滤镜应用以及图形渲染等。这些技术通常用于创建如模糊、旋转、裁剪、缩放、色彩调整、滤镜特效等常见功能。 1. **位图操作**...

    android图像处理系统1.0

    Bitmap是Android中表示图像的基本对象,它存储图像的像素数据。通过BitmapFactory类,我们可以从资源、文件或流中加载Bitmap。Canvas则用于在Bitmap上进行绘制,包括画线、文字、形状等。Bitmap与Canvas结合,可以...

    android手势处理图片平移、缩放和旋转

    在Android开发中,手势识别是实现用户交互的关键技术之一,特别是在图像处理方面。"android手势处理图片平移、缩放和旋转"这个主题涉及到的主要知识点包括Android手势检测、ImageView的扩展以及图片操作。 首先,...

    Android100种图片处理效果大全项目

    《Android100种图片处理效果大全项目》是一款专注于Android平台上的图像处理示例集合,提供了丰富的图片操作功能。这个项目旨在帮助开发者深入理解和实践Android系统中的图像处理技术,包括但不限于滤镜效果、裁剪、...

    Android 加载数据等待特效

    在Android中,我们可以使用各种方式实现这些特效,包括自定义View、使用第三方库以及Android自带的一些组件。 1. 自定义View:通过继承自Android的View类,开发者可以完全控制视图的绘制过程,从而实现复杂的动画...

    android触摸时扭曲变形图片照片,图片特效

    这些可以通过OpenCV库在Android中实现,OpenCV提供了丰富的图像处理函数。 另外,优化是不可忽视的一环。由于实时扭曲和变形可能会消耗大量计算资源,尤其是在处理高分辨率图像时,所以需要考虑性能优化。可以采用...

    一些非常炫的Android特效源码

    9. **实时滤镜和图像处理**:在图片应用或相机功能中,实时滤镜和图像处理特效是不可或缺的。源码可能涉及到OpenGL ES或renderscript的使用,实现图片的实时美颜、滤镜应用等功能。 10. **加载和空状态提示**:在...

    android图像增强饱和度、颜色、亮度滑动条SeekBar处理(源代码)

    本文是结合博客http://blog.csdn.net/eastmount/article/details/41668583关于android图像增强处理的。通过点击“打开图片”按钮选择本地图像,再通过3SeekBar按钮实现滑动修改图片的饱和度、色相和亮度。 免费资源...

    android图片处理集合demo

    使用OpenGL ES或RenderScript,可以将图像处理任务转移到GPU,提高处理速度,尤其适用于复杂的图像特效。 10. 图片选择器: 开发中,经常需要实现图片选择功能,可以集成像Android-Universal-Image-Loader这样的...

    Android系统联系人全特效实现,字母表快速滚动

    总之,实现Android系统联系人应用的全特效,尤其是字母表快速滚动,需要对Android的ContentProvider、UI设计、事件处理以及性能优化有深入理解。通过学习和实践,你可以创建出一个高效、易用的联系人应用。

    android时间轴特效

    在Android中,我们可以使用自定义View或者第三方库来实现这一效果。这里我们以自定义View为例,逐步介绍实现过程。 1. **自定义View的创建**: 创建一个新的Java类,继承自`View`或`ViewGroup`。在这个类中,我们...

    android随手拍图像处理demo(源码)

    该资源是博客http://blog.csdn.net/eastmount/article/details/43605509的android图像处理demo,希望对大家有所帮助.主要通过相册和照相处理图像,采用android 4.4开发. 个人对自己做的效果感觉不错.

Global site tag (gtag.js) - Google Analytics