Chinaunix首页 | 论坛 | 博客
  • 博客访问: 353244
  • 博文数量: 570
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-17 10:38
文章分类

全部博文(570)

文章存档

2015年(570)

我的朋友

分类: LINUX

2015-11-17 10:48:16

原文地址:android图片处理方法 作者:dixiaobing

Java代码  收藏代码
  1. /**
  2.      * 将彩色图转换为灰度图
  3.      * @param img 位图
  4.      * @return  返回转换好的位图
  5.      */   
  6.     public Bitmap convertGreyImg(Bitmap img) {   
  7.         int width = img.getWidth();         //获取位图的宽   
  8.         int height = img.getHeight();       //获取位图的高   
  9.            
  10.         int []pixels = new int[width * height]; //通过位图的大小创建像素点数组   
  11.            
  12.         img.getPixels(pixels, 0, width, 0, 0, width, height);   
  13.         int alpha = 0xFF << 24;    
  14.         for(int i = 0; i < height; i++)  {   
  15.             for(int j = 0; j < width; j++) {   
  16.                 int grey = pixels[width * i + j];   
  17.                    
  18.                 int red = ((grey  & 0x00FF0000 ) >> 16);   
  19.                 int green = ((grey & 0x0000FF00) >> 8);   
  20.                 int blue = (grey & 0x000000FF);   
  21.                    
  22.                 grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);   
  23.                 grey = alpha | (grey << 16) | (grey << 8) | grey;   
  24.                 pixels[width * i + j] = grey;   
  25.             }   
  26.         }   
  27.         Bitmap result = Bitmap.createBitmap(width, height, Config.RGB_565);   
  28.         result.setPixels(pixels, 0, width, 0, 0, width, height);   
  29.         return result;   
  30.     }   




将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。
Java代码  收藏代码
  1. import android.graphics.Bitmap;  
  2. public class ImagePiece {    
  3.     public int index = 0;         
  4.     public Bitmap bitmap = null;   

一个是ImageSplitter类,有一个静态方法split,传入的参数是要切割的Bitmap对象,和横向和竖向的切割片数。比如传入的是3、3,则横竖向都切割成3片,最终会将整个图片切割成3X3=9片。
Java代码  收藏代码
  1. import java.util.ArrayList;   
  2. import java.util.List;   
  3.    
  4. import android.graphics.Bitmap;   
  5.    
  6. public class ImageSplitter {   
  7.    
  8.     public static List<ImagePiece> split(Bitmap bitmap, int xPiece, int yPiece) {   
  9.    
  10.         List<ImagePiece> pieces = new ArrayList<ImagePiece>(xPiece * yPiece);   
  11.         int width = bitmap.getWidth();   
  12.         int height = bitmap.getHeight();   
  13.         int pieceWidth = width / 3;   
  14.         int pieceHeight = height / 3;   
  15.         for (int i = 0; i < yPiece; i++) {   
  16.             for (int j = 0; j < xPiece; j++) {   
  17.                 ImagePiece piece = new ImagePiece();   
  18.                 piece.index = j + i * xPiece;   
  19.                 int xValue = j * pieceWidth;   
  20.                 int yValue = i * pieceHeight;   
  21.                 piece.bitmap = Bitmap.createBitmap(bitmap, xValue, yValue,   
  22.                         pieceWidth, pieceHeight);   
  23.                 pieces.add(piece);   
  24.             }   
  25.         }   
  26.    
  27.         return pieces;   
  28.     }   
  29.    


1、图标加灰色过滤;
2、android的图片资源默认是静态的,单实例;如果两个IM好友的头像一样,最简单的都是用的软件自带头像,有一个在线,一个离线,直接改变头像的灰度,则两个用户的头像都会变灰或者在线,答案是:Drawable.mutate()。
Java代码  收藏代码
  1. Drawable mDrawable = context.getResources().getDrawable(R.drawable.face_icon);   
  2. //Make this drawable mutable.   
  3. //A mutable drawable is guaranteed to not share its state with any other drawable.   
  4. mDrawable.mutate();   
  5. ColorMatrix cm = new ColorMatrix();   
  6. cm.setSaturation(0);   
  7. ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);   
  8. mDrawable.setColorFilter(cf); 


生成缩略图,抠自android launcher源码:
Java代码  收藏代码
  1. /*
  2. * Copyright (C) 2008 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. *     
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */ 
  16.  
  17. package com.android.launcher; 
  18.  
  19. import android.graphics.drawable.BitmapDrawable; 
  20. import android.graphics.drawable.Drawable; 
  21. import android.graphics.drawable.PaintDrawable; 
  22. import android.graphics.Bitmap; 
  23. import android.graphics.PixelFormat; 
  24. import android.graphics.Canvas; 
  25. import android.graphics.PaintFlagsDrawFilter; 
  26. import android.graphics.Paint; 
  27. import android.graphics.Rect; 
  28. import android.content.res.Resources; 
  29. import android.content.Context; 
  30.  
  31. /**
  32. * Various utilities shared amongst the Launcher's classes.
  33. */ 
  34. final class Utilities { 
  35.     private static int sIconWidth = -1
  36.     private static int sIconHeight = -1
  37.  
  38.     private static final Paint sPaint = new Paint(); 
  39.     private static final Rect sBounds = new Rect(); 
  40.     private static final Rect sOldBounds = new Rect(); 
  41.     private static Canvas sCanvas = new Canvas(); 
  42.  
  43.     static
  44.         sCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG, 
  45.                 Paint.FILTER_BITMAP_FLAG)); 
  46.     } 
  47.  
  48.     /**
  49.      * Returns a Drawable representing the thumbnail of the specified Drawable.
  50.      * The size of the thumbnail is defined by the dimension
  51.      * android.R.dimen.launcher_application_icon_size.
  52.      *
  53.      * This method is not thread-safe and should be invoked on the UI thread only.
  54.      *
  55.      * @param icon The icon to get a thumbnail of.
  56.      * @param context The application's context.
  57.      *
  58.      * @return A thumbnail for the specified icon or the icon itself if the
  59.      *         thumbnail could not be created.
  60.      */ 
  61.     static Drawable createIconThumbnail(Drawable icon, Context context) { 
  62.         if (sIconWidth == -1) { 
  63.             final Resources resources = context.getResources(); 
  64.             sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size); 
  65.         } 
  66.  
  67.         int width = sIconWidth; 
  68.         int height = sIconHeight; 
  69.  
  70.         float scale = 1.0f; 
  71.         if (icon instanceof PaintDrawable) { 
  72.             PaintDrawable painter = (PaintDrawable) icon; 
  73.             painter.setIntrinsicWidth(width); 
  74.             painter.setIntrinsicHeight(height); 
  75.         } else if (icon instanceof BitmapDrawable) { 
  76.             // Ensure the bitmap has a density. 
  77.             BitmapDrawable bitmapDrawable = (BitmapDrawable) icon; 
  78.             Bitmap bitmap = bitmapDrawable.getBitmap(); 
  79.             if (bitmap.getDensity() == Bitmap.DENSITY_NONE) { 
  80.                 bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics()); 
  81.             } 
  82.         } 
  83.         int iconWidth = icon.getIntrinsicWidth(); 
  84.         int iconHeight = icon.getIntrinsicHeight(); 
  85.  
  86.         if (width > 0 && height > 0) { 
  87.             if (width < iconWidth || height < iconHeight || scale != 1.0f) { 
  88.                 final float ratio = (float) iconWidth / iconHeight; 
  89.  
  90.                 if (iconWidth > iconHeight) { 
  91.                     height = (int) (width / ratio); 
  92.                 } else if (iconHeight > iconWidth) { 
  93.                     width = (int) (height * ratio); 
  94.                 } 
  95.  
  96.                 final Bitmap.Config c = icon.getOpacity() != PixelFormat.OPAQUE ? 
  97.                             Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; 
  98.                 final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c); 
  99.                 final Canvas canvas = sCanvas; 
  100.                 canvas.setBitmap(thumb); 
  101.                 // Copy the old bounds to restore them later 
  102.                 // If we were to do oldBounds = icon.getBounds(), 
  103.                 // the call to setBounds() that follows would 
  104.                 // change the same instance and we would lose the 
  105.                 // old bounds 
  106.                 sOldBounds.set(icon.getBounds()); 
  107.                 final int x = (sIconWidth - width) / 2
  108.                 final int y = (sIconHeight - height) / 2
  109.                 icon.setBounds(x, y, x + width, y + height); 
  110.                 icon.draw(canvas); 
  111.                 icon.setBounds(sOldBounds); 
  112.                 icon = new FastBitmapDrawable(thumb); 
  113.             } else if (iconWidth < width && iconHeight < height) { 
  114.                 final Bitmap.Config c = Bitmap.Config.ARGB_8888; 
  115.                 final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c); 
  116.                 final Canvas canvas = sCanvas; 
  117.                 canvas.setBitmap(thumb); 
  118.                 sOldBounds.set(icon.getBounds()); 
  119.                 final int x = (width - iconWidth) / 2
  120.                 final int y = (height - iconHeight) / 2
  121.                 icon.setBounds(x, y, x + iconWidth, y + iconHeight); 
  122.                 icon.draw(canvas); 
  123.                 icon.setBounds(sOldBounds); 
  124.                 icon = new FastBitmapDrawable(thumb); 
  125.             } 
  126.         } 
  127.  
  128.         return icon; 
  129.     } 
  130.  
  131.     /**
  132.      * Returns a Bitmap representing the thumbnail of the specified Bitmap.
  133.      * The size of the thumbnail is defined by the dimension
  134.      * android.R.dimen.launcher_application_icon_size.
  135.      *
  136.      * This method is not thread-safe and should be invoked on the UI thread only.
  137.      *
  138.      * @param bitmap The bitmap to get a thumbnail of.
  139.      * @param context The application's context.
  140.      *
  141.      * @return A thumbnail for the specified bitmap or the bitmap itself if the
  142.      *         thumbnail could not be created.
  143.      */ 
  144.     static Bitmap createBitmapThumbnail(Bitmap bitmap, Context context) { 
  145.         if (sIconWidth == -1) { 
  146.             final Resources resources = context.getResources(); 
  147.             sIconWidth = sIconHeight = (int) resources.getDimension( 
  148.                     android.R.dimen.app_icon_size); 
  149.         } 
  150.  
  151.         int width = sIconWidth; 
  152.         int height = sIconHeight; 
  153.  
  154.         final int bitmapWidth = bitmap.getWidth(); 
  155.         final int bitmapHeight = bitmap.getHeight(); 
  156.  
  157.         if (width > 0 && height > 0) { 
  158.             if (width < bitmapWidth || height < bitmapHeight) { 
  159.                 final float ratio = (float) bitmapWidth / bitmapHeight; 
  160.      
  161.                 if (bitmapWidth > bitmapHeight) { 
  162.                     height = (int) (width / ratio); 
  163.                 } else if (bitmapHeight > bitmapWidth) { 
  164.                     width = (int) (height * ratio); 
  165.                 } 
  166.      
  167.                 final Bitmap.Config c = (width == sIconWidth && height == sIconHeight) ? 
  168.                         bitmap.getConfig() : Bitmap.Config.ARGB_8888; 
  169.                 final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c); 
  170.                 final Canvas canvas = sCanvas; 
  171.                 final Paint paint = sPaint; 
  172.                 canvas.setBitmap(thumb); 
  173.                 paint.setDither(false); 
  174.                 paint.setFilterBitmap(true); 
  175.                 sBounds.set((sIconWidth - width) / 2, (sIconHeight - height) / 2, width, height); 
  176.                 sOldBounds.set(0, 0, bitmapWidth, bitmapHeight); 
  177.                 canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint); 
  178.                 return thumb; 
  179.             } else if (bitmapWidth < width || bitmapHeight < height) { 
  180.                 final Bitmap.Config c = Bitmap.Config.ARGB_8888; 
  181.                 final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c); 
  182.                 final Canvas canvas = sCanvas; 
  183.                 final Paint paint = sPaint; 
  184.                 canvas.setBitmap(thumb); 
  185.                 paint.setDither(false); 
  186.                 paint.setFilterBitmap(true); 
  187.                 canvas.drawBitmap(bitmap, (sIconWidth - bitmapWidth) / 2
  188.                         (sIconHeight - bitmapHeight) / 2, paint); 
  189.                 return thumb; 
  190.             } 
  191.         } 
  192.  
  193.         return bitmap; 
  194.     } 


Java代码  收藏代码
  1. //Android Matrix类实现镜像方法 
  2. public void drawRegion(Image image_src, 
  3.  
  4. int x_src, int y_src, 
  5.  
  6. int width, int height, 
  7.  
  8. int transform, 
  9.  
  10. int x_dest, int y_dest, 
  11.  
  12. int anchor){ 
  13.  
  14. if((anchor&VCENTER) != 0){ 
  15.  
  16. y_dest -= height/2
  17.  
  18. }else if((anchor&BOTTOM) != 0){ 
  19.  
  20. y_dest -= height; 
  21.  
  22.  
  23. if((anchor&RIGHT) != 0){ 
  24.  
  25. x_dest -= width; 
  26.  
  27. }else if((anchor&HCENTER) != 0){ 
  28.  
  29. x_dest -= width/2
  30.  
  31.  
  32. Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height); 
  33.  
  34. Matrix mMatrix = new Matrix(); 
  35.  
  36. Matrix temp = new Matrix(); 
  37.  
  38. Matrix temp2 = new Matrix(); 
  39.  
  40. float[] mirrorY = { 
  41.  
  42. -1, 0, 0
  43. 0, 1, 0
  44. 0, 0, 1 
  45.  
  46. }; 
  47.  
  48. temp.setValues(mirrorY); 
  49.  
  50. switch(transform){ 
  51.  
  52. case Sprite.TRANS_NONE: 
  53.  
  54. break
  55.  
  56. case Sprite.TRANS_ROT90: 
  57.  
  58. mMatrix.setRotate(90,width/2, height/2); 
  59.  
  60. break
  61.  
  62. case Sprite.TRANS_ROT180: 
  63.  
  64. mMatrix.setRotate(180,width/2, height/2); 
  65.  
  66. break
  67.  
  68. case Sprite.TRANS_ROT270: 
  69.  
  70. mMatrix.setRotate(270,width/2, height/2); 
  71.  
  72. break
  73.  
  74. case Sprite.TRANS_MIRROR: 
  75.  
  76. mMatrix.postConcat(temp); 
  77.  
  78. break
  79.  
  80. case Sprite.TRANS_MIRROR_ROT90: 
  81.  
  82. mMatrix.postConcat(temp); 
  83.  
  84. mMatrix.setRotate(90,width/2, height/2); 
  85.  
  86. break
  87.  
  88. case Sprite.TRANS_MIRROR_ROT180: 
  89.  
  90. mMatrix.postConcat(temp); 
  91.  
  92. mMatrix.setRotate(180,width/2, height/2); 
  93.  
  94. break
  95.  
  96. case Sprite.TRANS_MIRROR_ROT270: 
  97.  
  98. mMatrix.postConcat(temp); 
  99.  
  100. mMatrix.setRotate(270,width/2, height/2); 
  101.  
  102. break
  103.  
  104.  
  105. mMatrix.setTranslate(x_dest, y_dest); 
  106.  
  107. canvas.drawBitmap(newMap, mMatrix, mPaint); 
  108.  


Java代码  收藏代码
  1. //图片Url保存为位图并进行缩放操作 
  2. //通过传入图片url获取位图方法 
  3. public Bitmap returnBitMap(String url) { 
  4.         URL myFileUrl = null
  5.         Bitmap bitmap = null
  6.         try
  7.             myFileUrl = new URL(url); 
  8.         } catch (MalformedURLException e) { 
  9.             e.printStackTrace(); 
  10.         } 
  11.         try
  12.             HttpURLConnection conn = (HttpURLConnection) myFileUrl 
  13.                     .openConnection(); 
  14.             conn.setDoInput(true); 
  15.             conn.connect(); 
  16.             InputStream is = conn.getInputStream(); 
  17.             bitmap = BitmapFactory.decodeStream(is); 
  18.             is.close(); 
  19.         } catch (IOException e) { 
  20.             e.printStackTrace(); 
  21.         } 
  22.         Log.v(tag, bitmap.toString()); 
  23.  
  24.         return bitmap; 
  25.     } 
  26. //通过传入位图,新的宽.高比进行位图的缩放操作 
  27. public static Drawable resizeImage(Bitmap bitmap, int w, int h) { 
  28.  
  29.         // load the origial Bitmap 
  30.         Bitmap BitmapOrg = bitmap; 
  31.  
  32.         int width = BitmapOrg.getWidth(); 
  33.         int height = BitmapOrg.getHeight(); 
  34.         int newWidth = w; 
  35.         int newHeight = h; 
  36.  
  37.         Log.v(tag, String.valueOf(width)); 
  38.         Log.v(tag, String.valueOf(height)); 
  39.  
  40.         Log.v(tag, String.valueOf(newWidth)); 
  41.         Log.v(tag, String.valueOf(newHeight)); 
  42.  
  43.         // calculate the scale 
  44.         float scaleWidth = ((float) newWidth) / width; 
  45.         float scaleHeight = ((float) newHeight) / height; 
  46.  
  47.         // create a matrix for the manipulation 
  48.         Matrix matrix = new Matrix(); 
  49.         // resize the Bitmap 
  50.         matrix.postScale(scaleWidth, scaleHeight); 
  51.         // if you want to rotate the Bitmap 
  52.         // matrix.postRotate(45); 
  53.  
  54.         // recreate the new Bitmap 
  55.         Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width, 
  56.                 height, matrix, true); 
  57.  
  58.         // make a Drawable from Bitmap to allow to set the Bitmap 
  59.         // to the ImageView, ImageButton or what ever 
  60.         return new BitmapDrawable(resizedBitmap); 
  61.  
  62.     } 


Java代码  收藏代码
  1. 1.图片加载方法,方便用户加载图片 
  2. /***
  3. * 加载本地图片
  4. * @param context:主运行函数实例
  5. * @param bitAdress:图片地址,一般指向R下的drawable目录
  6. * @return
  7. */ 
  8. public final Bitmap CreatImage(Context context, int bitAdress) { 
  9. Bitmap bitmaptemp = null
  10. bitmaptemp = BitmapFactory.decodeResource(context.getResources(), 
  11. bitAdress); 
  12. return bitmaptemp; 
  13. 2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用 
  14. /***
  15. * 图片分割
  16. *
  17. * @param g
  18. * :画布
  19. * @param paint
  20. * :画笔
  21. * @param imgBit
  22. * :图片
  23. * @param x
  24. * :X轴起点坐标
  25. * @param y
  26. * :Y轴起点坐标
  27. * @param w
  28. * :单一图片的宽度
  29. * @param h
  30. * :单一图片的高度
  31. * @param line
  32. * :第几列
  33. * @param row
  34. * :第几行
  35. */ 
  36. public final void cuteImage(Canvas g, Paint paint, Bitmap imgBit, int x, 
  37. int y, int w, int h, int line, int row) { 
  38. g.clipRect(x, y, x + w, h + y); 
  39. g.drawBitmap(imgBit, x – line * w, y – row * h, paint); 
  40. g.restore(); 
  41. 3.图片缩放,对当前图片进行缩放处理 
  42. /***
  43. * 图片的缩放方法
  44. *
  45. * @param bgimage
  46. * :源图片资源
  47. * @param newWidth
  48. * :缩放后宽度
  49. * @param newHeight
  50. * :缩放后高度
  51. * @return
  52. */ 
  53. public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) { 
  54. // 获取这个图片的宽和高 
  55. int width = bgimage.getWidth(); 
  56. int height = bgimage.getHeight(); 
  57. // 创建操作图片用的matrix对象 
  58. Matrix matrix = new Matrix(); 
  59. // 计算缩放率,新尺寸除原始尺寸 
  60. float scaleWidth = ((float) newWidth) / width; 
  61. float scaleHeight = ((float) newHeight) / height; 
  62. // 缩放图片动作 
  63. matrix.postScale(scaleWidth, scaleHeight); 
  64. Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, width, height, 
  65. matrix, true); 
  66. return bitmap; 
  67. 4.绘制带有边框的文字,一般在游戏中起文字的美化作用 
  68. /***
  69. * 绘制带有边框的文字
  70. *
  71. * @param strMsg
  72. * :绘制内容
  73. * @param g
  74. * :画布
  75. * @param paint
  76. * :画笔
  77. * @param setx
  78. * ::X轴起始坐标
  79. * @param sety
  80. * :Y轴的起始坐标
  81. * @param fg
  82. * :前景色
  83. * @param bg
  84. * :背景色
  85. */ 
  86. public void drawText(String strMsg, Canvas g, Paint paint, int setx, 
  87. int sety, int fg, int bg) { 
  88. paint.setColor(bg); 
  89. g.drawText(strMsg, setx + 1, sety, paint); 
  90. g.drawText(strMsg, setx, sety – 1, paint); 
  91. g.drawText(strMsg, setx, sety + 1, paint); 
  92. g.drawText(strMsg, setx – 1, sety, paint); 
  93. paint.setColor(fg); 
  94. g.drawText(strMsg, setx, sety, paint); 
  95. g.restore(); 
  96. 5.Android 图片透明度处理代码 
  97. /**
  98. * 图片透明度处理
  99. *
  100. * @param sourceImg
  101. *            原始图片
  102. * @param number
  103. *            透明度
  104. * @return
  105. */ 
  106. public static Bitmap setAlpha(Bitmap sourceImg, int number) { 
  107. int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()]; 
  108. sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值 
  109. number = number * 255 / 100
  110. for (int i = 0; i < argb.length; i++) { 
  111. argb = (number << 24) | (argb & 0×00FFFFFF);// 修改最高2位的值 
  112. sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888); 
  113. return sourceImg; 
  114. 6.图片翻转 
  115. Resources res = this.getContext().getResources(); 
  116. img = BitmapFactory.decodeResource(res, R.drawable.slogo); 
  117. Matrix matrix = new Matrix(); 
  118. matrix.postRotate(90);        /*翻转90度*/ 
  119. int width = img.getWidth(); 
  120. int height = img.getHeight(); 
  121. r_img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true); 

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

Java代码  收藏代码
  1. private byte[] Bitmap2Bytes(Bitmap bm){ 
  2.    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  3.    bm.compress(Bitmap.CompressFormat.PNG, 100, baos); 
  4.    return baos.toByteArray(); 
  5. private Bitmap Bytes2Bimap(byte[] b){ 
  6.             if(b.length!=0){ 
  7.                 return BitmapFactory.decodeByteArray(b, 0, b.length); 
  8.             } 
  9.             else
  10.                 return null
  11.             } 
  12.       } 
  13.  
  14. /**
  15.      * create the bitmap from a byte array
  16.      *生成水印图片
  17.      * @param src the bitmap object you want proecss
  18.      * @param watermark the water mark above the src
  19.      * @return return a bitmap object ,if paramter's length is 0,return null
  20.      */ 
  21.     private Bitmap createBitmap( Bitmap src, Bitmap watermark ) 
  22.     { 
  23.         String tag = "createBitmap"
  24.         Log.d( tag, "create a new bitmap" ); 
  25.         if( src == null
  26.         { 
  27.             return null
  28.         } 
  29.   
  30.         int w = src.getWidth(); 
  31.         int h = src.getHeight(); 
  32.         int ww = watermark.getWidth(); 
  33.         int wh = watermark.getHeight(); 
  34.         //create the new blank bitmap 
  35.         Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图 
  36.         Canvas cv = new Canvas( newb ); 
  37.         //draw src into 
  38.         cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src 
  39.         //draw watermark into 
  40.         cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印 
  41.         //save all clip 
  42.         cv.save( Canvas.ALL_SAVE_FLAG );//保存 
  43.         //store 
  44.         cv.restore();//存储 
  45.         return newb; 
  46.     } 
  47.    /** 重新编码Bitmap
  48.    *
  49.    * @param src
  50.    *          需要重新编码的Bitmap
  51.    *
  52.    * @param format
  53.    *          编码后的格式(目前只支持png和jpeg这两种格式)
  54.    *
  55.    * @param quality
  56.    *          重新生成后的bitmap的质量
  57.    *
  58.    * @return
  59.    *          返回重新生成后的bitmap
  60.    */ 
  61. private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format, 
  62.                                     int quality) { 
  63.             ByteArrayOutputStream os = new ByteArrayOutputStream(); 
  64.             src.compress(format, quality, os);             
  65.  
  66.             byte[] array = os.toByteArray(); 
  67.             return BitmapFactory.decodeByteArray(array, 0, array.length); 
  68.         } 
  69.  
  70. //Stream转换成Byte 
  71. static byte[] streamToBytes(InputStream is) { 
  72.       ByteArrayOutputStream os = new ByteArrayOutputStream(1024); 
  73.       byte[] buffer = new byte[1024]; 
  74.       int len; 
  75.       try
  76.              while ((len = is.read(buffer)) >= 0) { 
  77.              os.write(buffer, 0, len); 
  78.              } 
  79.           } catch (java.io.IOException e) { 
  80.  
  81.           } 
  82.           return os.toByteArray(); 
  83. //把View转换成Bitmap 
  84.  
  85.     /**
  86.      * 把一个View的对象转换成bitmap
  87.      */ 
  88.     static Bitmap getViewBitmap(View v) { 
  89.          
  90.         v.clearFocus(); 
  91.         v.setPressed(false); 
  92.  
  93.         //能画缓存就返回false 
  94.         boolean willNotCache = v.willNotCacheDrawing(); 
  95.         v.setWillNotCacheDrawing(false);  
  96.         int color = v.getDrawingCacheBackgroundColor(); 
  97.         v.setDrawingCacheBackgroundColor(0); 
  98.         if (color != 0) { 
  99.             v.destroyDrawingCache(); 
  100.         } 
  101.         v.buildDrawingCache(); 
  102.         Bitmap cacheBitmap = v.getDrawingCache(); 
  103.         if (cacheBitmap == null) { 
  104.             Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException()); 
  105.             return null
  106.         } 
  107.         Bitmap bitmap = Bitmap.createBitmap(cacheBitmap); 
  108.         // Restore the view 
  109.         v.destroyDrawingCache(); 
  110.         v.setWillNotCacheDrawing(willNotCache); 
  111.         v.setDrawingCacheBackgroundColor(color); 
  112.         return bitmap; 
  113.     } 

Java代码  收藏代码
  1. 读取raw资源文件中的mp3文件,然后通过音乐播放器播放: 
  2.  
  3.     /**
  4.      * 把mp3文件写入卡
  5.      *
  6.      * @param fileName
  7.      *             输出的文件名(全路径)
  8.      * @param context
  9.          *             context对象
  10.      */ 
  11.     private void writeMP3ToSDcard(String fileName, Context context) { 
  12.         byte[] buffer = new byte[1024 * 8]; 
  13.         int read; 
  14.         BufferedInputStream bin = new BufferedInputStream(context.getResources().openRawResource(R.raw.ring)); 
  15.         try
  16.             BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(fileName)); 
  17.             while ((read = bin.read(buffer)) > -1) { 
  18.                 bout.write(buffer, 0, read); 
  19.             } 
  20.             bout.flush(); 
  21.             bout.close(); 
  22.             bin.close(); 
  23.         } catch (FileNotFoundException e) { 
  24.             e.printStackTrace(); 
  25.         } catch (IOException e) { 
  26.             e.printStackTrace(); 
  27.         } 
  28.     } 
  29.  
  30.  
  31. Intent intent = new Intent(); 
  32. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
  33. intent.setAction(android.content.Intent.ACTION_VIEW); 
  34. intent.setDataAndType(Uri.fromFile(newFile("XXXXmp3的文件全路径")),"audio/*"); 
  35. startActivity(intent); 


绘制图像倒影
Java代码  收藏代码
  1. private void   
  2. _Init()    
  3. {    
  4.   m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);    
  5.   LinearGradient lg = new LinearGradient(    
  6.     0, 0, 0, m_nShadowH,     
  7.     0xB0FFFFFF, 0x00000000,    
  8.     Shader.TileMode.CLAMP);    
  9.   m_paint.setShader(lg);    
  10.   m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));    
  11. }    
  12.    
  13. @Override protected void     
  14. onDraw(Canvas canvas)    
  15. {    
  16.   super.onDraw(canvas);    
  17.    
  18.   int nX = 0;    
  19.   int nY = 20;    
  20.    
  21.   _DrawNormalImg(canvas, nX, nY);    
  22.   _DrawMirror(canvas, nX, nY);    
  23. }     
  24.    
  25. private void   
  26. _DrawNormalImg(Canvas canvas, int nX, int nY)    
  27. {    
  28.   canvas.save(Canvas.MATRIX_SAVE_FLAG);    
  29.   canvas.translate(nX, nY);       
  30.   m_dw.draw(canvas);    
  31.   canvas.restore();    
  32. }    
  33.    
  34. private void   
  35. _DrawMirror(Canvas canvas, int nX, int nY)    
  36. {    
  37.   int nW = m_dw.getIntrinsicWidth();    
  38.   int nH = m_dw.getIntrinsicHeight();    
  39.    
  40.   ///////////////////////////////////    
  41.   //draw mirror image    
  42.   canvas.save(Canvas.MATRIX_SAVE_FLAG);    
  43.   canvas.scale(1.0f, -1.0f);    
  44.   canvas.translate(nX, -(nY + nH * 2));    
  45.   canvas.clipRect(0, nH, nW, nH - m_nShadowH);    
  46.   m_dw.draw(canvas);    
  47.   canvas.restore();    
  48.    
  49.   //////////////////////////////    
  50.   //draw mask    
  51.   canvas.save();    
  52.   canvas.translate(nX, nY + nH);    
  53.   canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);    
  54.   canvas.restore();    
  55. }   

Android 繪圖座標體系預設的原點在左上角,X 軸往右是越來越大的正值,而 Y 軸往下,則是越來越大的正值。要畫出垂直翻轉的圖片,其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧,沒想到給 scale() 函式一個負值,就可以翻轉相對應的軸。
在 Photoshop 中,做鏡像特效的第二步是要對這翻轉的圖片,加個由灰到黑的漸層 mask。
在 Android 中,要畫漸層色,那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask,就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式,就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。

 


阅读(239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~