Android简单图像处理

一、图片处理方法

Java代码  收藏代码
  1. //压缩图片大小  
  2.     public static Bitmap compressImage(Bitmap image) {  
  3.   
  4.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  5.         image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中  
  6.         int options = 100;  
  7.         while ( baos.toByteArray().length / 1024>100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩         
  8.             baos.reset();//重置baos即清空baos  
  9.             image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中  
  10.             options -= 10;//每次都减少10  
  11.         }  
  12.         ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中  
  13.         Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片  
  14.         return bitmap;  
  15.     }  
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;    
  5. }  


一个是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.     
  30. }  



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.  *      http://www.apache.org/licenses/LICENSE-2.0 
  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.     }  
  195. }  



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.   
  24. if((anchor&RIGHT) != 0){  
  25.   
  26. x_dest -= width;  
  27.   
  28. }else if((anchor&HCENTER) != 0){  
  29.   
  30. x_dest -= width/2;  
  31.   
  32. }  
  33.   
  34. Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);  
  35.   
  36. Matrix mMatrix = new Matrix();  
  37.   
  38. Matrix temp = new Matrix();  
  39.   
  40. Matrix temp2 = new Matrix();  
  41.   
  42. float[] mirrorY = {  
  43.   
  44. -1, 0, 0,  
  45. 0, 1, 0,  
  46. 0, 0, 1  
  47.   
  48. };  
  49.   
  50. temp.setValues(mirrorY);  
  51.   
  52. switch(transform){  
  53.   
  54. case Sprite.TRANS_NONE:  
  55.   
  56. break;  
  57.   
  58. case Sprite.TRANS_ROT90:  
  59.   
  60. mMatrix.setRotate(90,width/2, height/2);  
  61.   
  62. break;  
  63.   
  64. case Sprite.TRANS_ROT180:  
  65.   
  66. mMatrix.setRotate(180,width/2, height/2);  
  67.   
  68. break;  
  69.   
  70. case Sprite.TRANS_ROT270:  
  71.   
  72. mMatrix.setRotate(270,width/2, height/2);  
  73.   
  74. break;  
  75.   
  76. case Sprite.TRANS_MIRROR:  
  77.   
  78. mMatrix.postConcat(temp);  
  79.   
  80. break;  
  81.   
  82. case Sprite.TRANS_MIRROR_ROT90:  
  83.   
  84. mMatrix.postConcat(temp);  
  85.   
  86. mMatrix.setRotate(90,width/2, height/2);  
  87.   
  88. break;  
  89.   
  90. case Sprite.TRANS_MIRROR_ROT180:  
  91.   
  92. mMatrix.postConcat(temp);  
  93.   
  94. mMatrix.setRotate(180,width/2, height/2);  
  95.   
  96. break;  
  97.   
  98. case Sprite.TRANS_MIRROR_ROT270:  
  99.   
  100. mMatrix.postConcat(temp);  
  101.   
  102. mMatrix.setRotate(270,width/2, height/2);  
  103.   
  104. break;  
  105.   
  106. }  
  107.   
  108. mMatrix.setTranslate(x_dest, y_dest);  
  109.   
  110. canvas.drawBitmap(newMap, mMatrix, mPaint);  
  111.   
  112. }  



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. }  
  14. 2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用  
  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. }  
  42. 3.图片缩放,对当前图片进行缩放处理  
  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. }  
  68. 4.绘制带有边框的文字,一般在游戏中起文字的美化作用  
  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. }  
  97. 5.Android 图片透明度处理代码  
  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. }  
  113. sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);  
  114. return sourceImg;  
  115. }  
  116. 6.图片翻转  
  117. Resources res = this.getContext().getResources();  
  118. img = BitmapFactory.decodeResource(res, R.drawable.slogo);  
  119. Matrix matrix = new Matrix();  
  120. matrix.postRotate(90);        /*翻转90度*/  
  121. int width = img.getWidth();  
  122. int height = img.getHeight();  
  123. 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. public class ImageUtil {  
  20.   
  21. /** 
  22. * 放大缩小图片 
  23. */  
  24. public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {  
  25.    int width = bitmap.getWidth();  
  26.    int height = bitmap.getHeight();  
  27.    Matrix matrix = new Matrix();  
  28.    float scaleWidht = ((float) w / width);  
  29.    float scaleHeight = ((float) h / height);  
  30.    matrix.postScale(scaleWidht, scaleHeight);  
  31.    Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);  
  32.    return newbmp;  
  33. }  
  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. */  
  52. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {  
  53.   
  54.    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
  55.    Canvas canvas = new Canvas(output);  
  56.   
  57.    final int color = 0xff424242;  
  58.    final Paint paint = new Paint();  
  59.    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
  60.    final RectF rectF = new RectF(rect);  
  61.   
  62.    paint.setAntiAlias(true);  
  63.    canvas.drawARGB(0, 0, 0, 0);  
  64.    paint.setColor(color);  
  65.    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  66.   
  67.    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  68.    canvas.drawBitmap(bitmap, rect, rect, paint);  
  69.   
  70.    return output;  
  71. }  
  72.   
  73. /** 
  74. * 获得带倒影的图片方法 
  75. */  
  76. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {  
  77.    final int reflectionGap = 4;  
  78.    int width = bitmap.getWidth();  
  79.    int height = bitmap.getHeight();  
  80.   
  81.    Matrix matrix = new Matrix();  
  82.    matrix.preScale(1, -1);  
  83.   
  84.    Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false);  
  85.   
  86.    Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);  
  87.   
  88.    Canvas canvas = new Canvas(bitmapWithReflection);  
  89.    canvas.drawBitmap(bitmap, 0, 0, null);  
  90.    Paint deafalutPaint = new Paint();  
  91.    canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);  
  92.   
  93.    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
  94.   
  95.    Paint paint = new Paint();  
  96.    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);  
  97.    paint.setShader(shader);  
  98.    // Set the Transfer mode to be porter duff and destination in  
  99.    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
  100.    // Draw a rectangle using the paint with our linear gradient  
  101.    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);  
  102.    return bitmapWithReflection;  
  103. }  
  104. }  

 

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

 

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 物件。

二、滤镜效果

  第三方开源项目,多达40多种效果

   https://github.com/daizhenjun/ImageFilterForAndroid

InvertFilter


AutoLevelFilter

RadialDistortionFilter


BannerFilter(20, true)

BannerFilter(20, false)


BigBrotherFilter

BlackWhiteFilter

ColorQuantizeFilter

ConvolutionFilter


BrickFilter

BlockPrintFilter

EdgeFilter


FeatherFilter


 

GaussianBlurFilter

GradientMapFilter

HistogramEqualFilter

LightFilter

MistFilter

MonitorFilter

MosaicFilter


NeonFilter

NightVisionFilter

NoiseFilter

OilPaintFilter

OldPhotoFilter

PixelateFilter

  

RainBowFilter 

RectMatrixFilter

ReflectionFilter(false)

ReflectionFilter(true)

ReliefFilter

SaturationModifyFilter

SepiaFilter

SmashColorFilter

ThresholdFilter

TintFilter

VignetteFilter

VintageFilter

WaterWaveFilter

XRadiationFilter

 

 

原文地址:https://www.cnblogs.com/ymczxy/p/4710828.html