zoukankan      html  css  js  c++  java
  • 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

     

     

  • 相关阅读:
    iOS开发-图片高斯模糊效果
    很认真地聊一聊程序员的自我修养
    iOS 动画队列—仿映客刷礼物效果
    iOS -NSOperation并发编程
    iOS Status Bar变换
    iOS 使用Quartz和OpenGL绘图
    iOS开发中WiFi相关功能总结
    视频直播初窥:高仿喵播APP
    智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程
    《iOS开发指南》要改iOS8版本了,听听您的意见?
  • 原文地址:https://www.cnblogs.com/ymczxy/p/4710828.html
Copyright © 2011-2022 走看看