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, nullnull);//把ByteArrayInputStream数据生成图片   
  14.         return bitmap;   
  15.     }  
//压缩图片大小
	public static Bitmap compressImage(Bitmap image) {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
		int options = 100;
		while ( baos.toByteArray().length / 1024>100) {	//循环判断如果压缩后图片是否大于100kb,大于继续压缩		
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
			options -= 10;//每次都减少10
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
		return bitmap;
	}
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, 00, 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, 00, width, height);     
  29.         return result;     
  30.     }    
/** 
     * 将彩色图转换为灰度图 
     * @param img 位图 
     * @return  返回转换好的位图 
     */  
    public Bitmap convertGreyImg(Bitmap img) {  
        int width = img.getWidth();         //获取位图的宽  
        int height = img.getHeight();       //获取位图的高  
          
        int []pixels = new int[width * height]; //通过位图的大小创建像素点数组  
          
        img.getPixels(pixels, 0, width, 0, 0, width, height);  
        int alpha = 0xFF << 24;   
        for(int i = 0; i < height; i++)  {  
            for(int j = 0; j < width; j++) {  
                int grey = pixels[width * i + j];  
                  
                int red = ((grey  & 0x00FF0000 ) >> 16);  
                int green = ((grey & 0x0000FF00) >> 8);  
                int blue = (grey & 0x000000FF);  
                  
                grey = (int)((float) red * 0.3 + (float)green * 0.59 + (float)blue * 0.11);  
                grey = alpha | (grey << 16) | (grey << 8) | grey;  
                pixels[width * i + j] = grey;  
            }  
        }  
        Bitmap result = Bitmap.createBitmap(width, height, Config.RGB_565);  
        result.setPixels(pixels, 0, width, 0, 0, width, height);  
        return result;  
    }  





将一个图片切割成多个图片
有种场景,我们想将一个图片切割成多个图片。比如我们在开发一个拼图的游戏,就首先要对图片进行切割。
以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。
一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。

Java代码 复制代码  收藏代码
  1. import android.graphics.Bitmap;    
  2. public class ImagePiece {      
  3.     public int index = 0;           
  4.     public Bitmap bitmap = null;     
  5. }  
import android.graphics.Bitmap; 
public class ImagePiece {   
    public int index = 0;        
    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.      
  30. }  
import java.util.ArrayList;  
import java.util.List;  
  
import android.graphics.Bitmap;  
  
public class ImageSplitter {  
  
    public static List<ImagePiece> split(Bitmap bitmap, int xPiece, int yPiece) {  
  
        List<ImagePiece> pieces = new ArrayList<ImagePiece>(xPiece * yPiece);  
        int width = bitmap.getWidth();  
        int height = bitmap.getHeight();  
        int pieceWidth = width / 3;  
        int pieceHeight = height / 3;  
        for (int i = 0; i < yPiece; i++) {  
            for (int j = 0; j < xPiece; j++) {  
                ImagePiece piece = new ImagePiece();  
                piece.index = j + i * xPiece;  
                int xValue = j * pieceWidth;  
                int yValue = i * pieceHeight;  
                piece.bitmap = Bitmap.createBitmap(bitmap, xValue, yValue,  
                        pieceWidth, pieceHeight);  
                pieces.add(piece);  
            }  
        }  
  
        return pieces;  
    }  
  
}



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);  
Drawable mDrawable = context.getResources().getDrawable(R.drawable.face_icon);  
//Make this drawable mutable.  
//A mutable drawable is guaranteed to not share its state with any other drawable.  
mDrawable.mutate();  
ColorMatrix cm = new ColorMatrix();  
cm.setSaturation(0);  
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);  
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(00, 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. }  
/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.launcher;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PaintDrawable;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.Canvas;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Paint;
import android.graphics.Rect;
import android.content.res.Resources;
import android.content.Context;

/**
 * Various utilities shared amongst the Launcher's classes.
 */
final class Utilities {
    private static int sIconWidth = -1;
    private static int sIconHeight = -1;

    private static final Paint sPaint = new Paint();
    private static final Rect sBounds = new Rect();
    private static final Rect sOldBounds = new Rect();
    private static Canvas sCanvas = new Canvas();

    static {
        sCanvas.setDrawFilter(new PaintFlagsDrawFilter(Paint.DITHER_FLAG,
                Paint.FILTER_BITMAP_FLAG));
    }

    /**
     * Returns a Drawable representing the thumbnail of the specified Drawable.
     * The size of the thumbnail is defined by the dimension
     * android.R.dimen.launcher_application_icon_size.
     *
     * This method is not thread-safe and should be invoked on the UI thread only.
     *
     * @param icon The icon to get a thumbnail of.
     * @param context The application's context.
     *
     * @return A thumbnail for the specified icon or the icon itself if the
     *         thumbnail could not be created. 
     */
    static Drawable createIconThumbnail(Drawable icon, Context context) {
        if (sIconWidth == -1) {
            final Resources resources = context.getResources();
            sIconWidth = sIconHeight = (int) resources.getDimension(android.R.dimen.app_icon_size);
        }

        int width = sIconWidth;
        int height = sIconHeight;

        float scale = 1.0f;
        if (icon instanceof PaintDrawable) {
            PaintDrawable painter = (PaintDrawable) icon;
            painter.setIntrinsicWidth(width);
            painter.setIntrinsicHeight(height);
        } else if (icon instanceof BitmapDrawable) {
            // Ensure the bitmap has a density.
            BitmapDrawable bitmapDrawable = (BitmapDrawable) icon;
            Bitmap bitmap = bitmapDrawable.getBitmap();
            if (bitmap.getDensity() == Bitmap.DENSITY_NONE) {
                bitmapDrawable.setTargetDensity(context.getResources().getDisplayMetrics());
            }
        }
        int iconWidth = icon.getIntrinsicWidth();
        int iconHeight = icon.getIntrinsicHeight();

        if (width > 0 && height > 0) {
            if (width < iconWidth || height < iconHeight || scale != 1.0f) {
                final float ratio = (float) iconWidth / iconHeight;

                if (iconWidth > iconHeight) {
                    height = (int) (width / ratio);
                } else if (iconHeight > iconWidth) {
                    width = (int) (height * ratio);
                }

                final Bitmap.Config c = icon.getOpacity() != PixelFormat.OPAQUE ?
                            Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
                final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
                final Canvas canvas = sCanvas;
                canvas.setBitmap(thumb);
                // Copy the old bounds to restore them later
                // If we were to do oldBounds = icon.getBounds(),
                // the call to setBounds() that follows would
                // change the same instance and we would lose the
                // old bounds
                sOldBounds.set(icon.getBounds());
                final int x = (sIconWidth - width) / 2;
                final int y = (sIconHeight - height) / 2;
                icon.setBounds(x, y, x + width, y + height);
                icon.draw(canvas);
                icon.setBounds(sOldBounds);
                icon = new FastBitmapDrawable(thumb);
            } else if (iconWidth < width && iconHeight < height) {
                final Bitmap.Config c = Bitmap.Config.ARGB_8888;
                final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
                final Canvas canvas = sCanvas;
                canvas.setBitmap(thumb);
                sOldBounds.set(icon.getBounds());
                final int x = (width - iconWidth) / 2;
                final int y = (height - iconHeight) / 2;
                icon.setBounds(x, y, x + iconWidth, y + iconHeight);
                icon.draw(canvas);
                icon.setBounds(sOldBounds);
                icon = new FastBitmapDrawable(thumb);
            }
        }

        return icon;
    }

    /**
     * Returns a Bitmap representing the thumbnail of the specified Bitmap.
     * The size of the thumbnail is defined by the dimension
     * android.R.dimen.launcher_application_icon_size.
     *
     * This method is not thread-safe and should be invoked on the UI thread only.
     *
     * @param bitmap The bitmap to get a thumbnail of.
     * @param context The application's context.
     *
     * @return A thumbnail for the specified bitmap or the bitmap itself if the
     *         thumbnail could not be created.
     */
    static Bitmap createBitmapThumbnail(Bitmap bitmap, Context context) {
        if (sIconWidth == -1) {
            final Resources resources = context.getResources();
            sIconWidth = sIconHeight = (int) resources.getDimension(
                    android.R.dimen.app_icon_size);
        }

        int width = sIconWidth;
        int height = sIconHeight;

        final int bitmapWidth = bitmap.getWidth();
        final int bitmapHeight = bitmap.getHeight();

        if (width > 0 && height > 0) {
            if (width < bitmapWidth || height < bitmapHeight) {
                final float ratio = (float) bitmapWidth / bitmapHeight;
    
                if (bitmapWidth > bitmapHeight) {
                    height = (int) (width / ratio);
                } else if (bitmapHeight > bitmapWidth) {
                    width = (int) (height * ratio);
                }
    
                final Bitmap.Config c = (width == sIconWidth && height == sIconHeight) ?
                        bitmap.getConfig() : Bitmap.Config.ARGB_8888;
                final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
                final Canvas canvas = sCanvas;
                final Paint paint = sPaint;
                canvas.setBitmap(thumb);
                paint.setDither(false);
                paint.setFilterBitmap(true);
                sBounds.set((sIconWidth - width) / 2, (sIconHeight - height) / 2, width, height);
                sOldBounds.set(0, 0, bitmapWidth, bitmapHeight);
                canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint);
                return thumb;
            } else if (bitmapWidth < width || bitmapHeight < height) {
                final Bitmap.Config c = Bitmap.Config.ARGB_8888;
                final Bitmap thumb = Bitmap.createBitmap(sIconWidth, sIconHeight, c);
                final Canvas canvas = sCanvas;
                final Paint paint = sPaint;
                canvas.setBitmap(thumb);
                paint.setDither(false);
                paint.setFilterBitmap(true);
                canvas.drawBitmap(bitmap, (sIconWidth - bitmapWidth) / 2,
                        (sIconHeight - bitmapHeight) / 2, paint);
                return thumb;
            }
        }

        return bitmap;
    }
}



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. -100,   
  45. 010,   
  46. 001  
  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. }  
//Android Matrix类实现镜像方法
public void drawRegion(Image image_src,

int x_src, int y_src,

int width, int height,

int transform,

int x_dest, int y_dest,

int anchor){

if((anchor&VCENTER) != 0){

y_dest -= height/2;

}else if((anchor&BOTTOM) != 0){

y_dest -= height;

}

if((anchor&RIGHT) != 0){

x_dest -= width;

}else if((anchor&HCENTER) != 0){

x_dest -= width/2;

}

Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);

Matrix mMatrix = new Matrix();

Matrix temp = new Matrix();

Matrix temp2 = new Matrix();

float[] mirrorY = {

-1, 0, 0,
0, 1, 0,
0, 0, 1

};

temp.setValues(mirrorY);

switch(transform){

case Sprite.TRANS_NONE:

break;

case Sprite.TRANS_ROT90:

mMatrix.setRotate(90,width/2, height/2);

break;

case Sprite.TRANS_ROT180:

mMatrix.setRotate(180,width/2, height/2);

break;

case Sprite.TRANS_ROT270:

mMatrix.setRotate(270,width/2, height/2);

break;

case Sprite.TRANS_MIRROR:

mMatrix.postConcat(temp);

break;

case Sprite.TRANS_MIRROR_ROT90:

mMatrix.postConcat(temp);

mMatrix.setRotate(90,width/2, height/2);

break;

case Sprite.TRANS_MIRROR_ROT180:

mMatrix.postConcat(temp);

mMatrix.setRotate(180,width/2, height/2);

break;

case Sprite.TRANS_MIRROR_ROT270:

mMatrix.postConcat(temp);

mMatrix.setRotate(270,width/2, height/2);

break;

}

mMatrix.setTranslate(x_dest, y_dest);

canvas.drawBitmap(newMap, mMatrix, mPaint);

}



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, 00, 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.     }  
//图片Url保存为位图并进行缩放操作
//通过传入图片url获取位图方法
public Bitmap returnBitMap(String url) {
		URL myFileUrl = null;
		Bitmap bitmap = null;
		try {
			myFileUrl = new URL(url);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		try {
			HttpURLConnection conn = (HttpURLConnection) myFileUrl
					.openConnection();
			conn.setDoInput(true);
			conn.connect();
			InputStream is = conn.getInputStream();
			bitmap = BitmapFactory.decodeStream(is);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Log.v(tag, bitmap.toString());

		return bitmap;
	}
//通过传入位图,新的宽.高比进行位图的缩放操作
public static Drawable resizeImage(Bitmap bitmap, int w, int h) {

		// load the origial Bitmap
		Bitmap BitmapOrg = bitmap;

		int width = BitmapOrg.getWidth();
		int height = BitmapOrg.getHeight();
		int newWidth = w;
		int newHeight = h;

		Log.v(tag, String.valueOf(width));
		Log.v(tag, String.valueOf(height));

		Log.v(tag, String.valueOf(newWidth));
		Log.v(tag, String.valueOf(newHeight));

		// calculate the scale
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;

		// create a matrix for the manipulation
		Matrix matrix = new Matrix();
		// resize the Bitmap
		matrix.postScale(scaleWidth, scaleHeight);
		// if you want to rotate the Bitmap
		// matrix.postRotate(45);

		// recreate the new Bitmap
		Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 0, 0, width,
				height, matrix, true);

		// make a Drawable from Bitmap to allow to set the Bitmap
		// to the ImageView, ImageButton or what ever
		return new BitmapDrawable(resizedBitmap);

	}



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. *  
  18. * @param g  
  19. * :画布  
  20. * @param paint  
  21. * :画笔  
  22. * @param imgBit  
  23. * :图片  
  24. * @param x  
  25. * :X轴起点坐标  
  26. * @param y  
  27. * :Y轴起点坐标  
  28. * @param w  
  29. * :单一图片的宽度  
  30. * @param h  
  31. * :单一图片的高度  
  32. * @param line  
  33. * :第几列  
  34. * @param row  
  35. * :第几行  
  36. */  
  37. public final void cuteImage(Canvas g, Paint paint, Bitmap imgBit, int x,   
  38. int y, int w, int h, int line, int row) {   
  39. g.clipRect(x, y, x + w, h + y);   
  40. g.drawBitmap(imgBit, x – line * w, y – row * h, paint);   
  41. g.restore();   
  42. }   
  43. 3.图片缩放,对当前图片进行缩放处理   
  44. /***  
  45. * 图片的缩放方法  
  46. *  
  47. * @param bgimage  
  48. * :源图片资源  
  49. * @param newWidth  
  50. * :缩放后宽度  
  51. * @param newHeight  
  52. * :缩放后高度  
  53. * @return  
  54. */  
  55. public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) {   
  56. // 获取这个图片的宽和高   
  57. int width = bgimage.getWidth();   
  58. int height = bgimage.getHeight();   
  59. // 创建操作图片用的matrix对象   
  60. Matrix matrix = new Matrix();   
  61. // 计算缩放率,新尺寸除原始尺寸   
  62. float scaleWidth = ((float) newWidth) / width;   
  63. float scaleHeight = ((float) newHeight) / height;   
  64. // 缩放图片动作   
  65. matrix.postScale(scaleWidth, scaleHeight);   
  66. Bitmap bitmap = Bitmap.createBitmap(bgimage, 00, width, height,   
  67. matrix, true);   
  68. return bitmap;   
  69. }   
  70. 4.绘制带有边框的文字,一般在游戏中起文字的美化作用   
  71. /***  
  72. * 绘制带有边框的文字  
  73. *  
  74. * @param strMsg  
  75. * :绘制内容  
  76. * @param g  
  77. * :画布  
  78. * @param paint  
  79. * :画笔  
  80. * @param setx  
  81. * ::X轴起始坐标  
  82. * @param sety  
  83. * :Y轴的起始坐标  
  84. * @param fg  
  85. * :前景色  
  86. * @param bg  
  87. * :背景色  
  88. */  
  89. public void drawText(String strMsg, Canvas g, Paint paint, int setx,   
  90. int sety, int fg, int bg) {   
  91. paint.setColor(bg);   
  92. g.drawText(strMsg, setx + 1, sety, paint);   
  93. g.drawText(strMsg, setx, sety – 1, paint);   
  94. g.drawText(strMsg, setx, sety + 1, paint);   
  95. g.drawText(strMsg, setx – 1, sety, paint);   
  96. paint.setColor(fg);   
  97. g.drawText(strMsg, setx, sety, paint);   
  98. g.restore();   
  99. }   
  100. 5.Android 图片透明度处理代码   
  101. /**  
  102. * 图片透明度处理  
  103. *  
  104. * @param sourceImg  
  105. *            原始图片  
  106. * @param number  
  107. *            透明度  
  108. * @return  
  109. */  
  110. public static Bitmap setAlpha(Bitmap sourceImg, int number) {   
  111. int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];   
  112. sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 00,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值   
  113. number = number * 255 / 100;   
  114. for (int i = 0; i < argb.length; i++) {   
  115. argb = (number << 24) | (argb & 0×00FFFFFF);// 修改最高2位的值   
  116. }   
  117. sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);   
  118. return sourceImg;   
  119. }   
  120. 6.图片翻转   
  121. Resources res = this.getContext().getResources();   
  122. img = BitmapFactory.decodeResource(res, R.drawable.slogo);   
  123. Matrix matrix = new Matrix();   
  124. matrix.postRotate(90);        /*翻转90度*/  
  125. int width = img.getWidth();   
  126. int height = img.getHeight();   
  127. r_img = Bitmap.createBitmap(img, 00, width, height, matrix, true);  
1.图片加载方法,方便用户加载图片
/***
* 加载本地图片
* @param context:主运行函数实例
* @param bitAdress:图片地址,一般指向R下的drawable目录
* @return
*/
public final Bitmap CreatImage(Context context, int bitAdress) {
Bitmap bitmaptemp = null;
bitmaptemp = BitmapFactory.decodeResource(context.getResources(),
bitAdress);
return bitmaptemp;
}
2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用
/***
* 图片分割
*
* @param g
* :画布
* @param paint
* :画笔
* @param imgBit
* :图片
* @param x
* :X轴起点坐标
* @param y
* :Y轴起点坐标
* @param w
* :单一图片的宽度
* @param h
* :单一图片的高度
* @param line
* :第几列
* @param row
* :第几行
*/
public final void cuteImage(Canvas g, Paint paint, Bitmap imgBit, int x,
int y, int w, int h, int line, int row) {
g.clipRect(x, y, x + w, h + y);
g.drawBitmap(imgBit, x – line * w, y – row * h, paint);
g.restore();
}
3.图片缩放,对当前图片进行缩放处理
/***
* 图片的缩放方法
*
* @param bgimage
* :源图片资源
* @param newWidth
* :缩放后宽度
* @param newHeight
* :缩放后高度
* @return
*/
public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) {
// 获取这个图片的宽和高
int width = bgimage.getWidth();
int height = bgimage.getHeight();
// 创建操作图片用的matrix对象
Matrix matrix = new Matrix();
// 计算缩放率,新尺寸除原始尺寸
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, width, height,
matrix, true);
return bitmap;
}
4.绘制带有边框的文字,一般在游戏中起文字的美化作用
/***
* 绘制带有边框的文字
*
* @param strMsg
* :绘制内容
* @param g
* :画布
* @param paint
* :画笔
* @param setx
* ::X轴起始坐标
* @param sety
* :Y轴的起始坐标
* @param fg
* :前景色
* @param bg
* :背景色
*/
public void drawText(String strMsg, Canvas g, Paint paint, int setx,
int sety, int fg, int bg) {
paint.setColor(bg);
g.drawText(strMsg, setx + 1, sety, paint);
g.drawText(strMsg, setx, sety – 1, paint);
g.drawText(strMsg, setx, sety + 1, paint);
g.drawText(strMsg, setx – 1, sety, paint);
paint.setColor(fg);
g.drawText(strMsg, setx, sety, paint);
g.restore();
}
5.Android 图片透明度处理代码
/**
* 图片透明度处理
*
* @param sourceImg
*            原始图片
* @param number
*            透明度
* @return
*/
public static Bitmap setAlpha(Bitmap sourceImg, int number) {
int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];
sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值
number = number * 255 / 100;
for (int i = 0; i < argb.length; i++) {
argb = (number << 24) | (argb & 0×00FFFFFF);// 修改最高2位的值
}
sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);
return sourceImg;
}
6.图片翻转
Resources res = this.getContext().getResources();
img = BitmapFactory.decodeResource(res, R.drawable.slogo);
Matrix matrix = new Matrix();
matrix.postRotate(90);        /*翻转90度*/
int width = img.getWidth();
int height = img.getHeight();
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, 00, width, height, matrix, true);   
  33.    return newbmp;   
  34. }   
  35.   
  36. /**  
  37. * 将Drawable转化为Bitmap  
  38. */  
  39. public static Bitmap drawableToBitmap(Drawable drawable) {   
  40.    int width = drawable.getIntrinsicWidth();   
  41.    int height = drawable.getIntrinsicHeight();   
  42.    Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);   
  43.    Canvas canvas = new Canvas(bitmap);   
  44.    drawable.setBounds(00, width, height);   
  45.    drawable.draw(canvas);   
  46.    return bitmap;   
  47.   
  48. }   
  49.   
  50. /**  
  51. * 获得圆角图片的方法  
  52. */  
  53. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {   
  54.   
  55.    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);   
  56.    Canvas canvas = new Canvas(output);   
  57.   
  58.    final int color = 0xff424242;   
  59.    final Paint paint = new Paint();   
  60.    final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());   
  61.    final RectF rectF = new RectF(rect);   
  62.   
  63.    paint.setAntiAlias(true);   
  64.    canvas.drawARGB(0000);   
  65.    paint.setColor(color);   
  66.    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);   
  67.   
  68.    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));   
  69.    canvas.drawBitmap(bitmap, rect, rect, paint);   
  70.   
  71.    return output;   
  72. }   
  73.   
  74. /**  
  75. * 获得带倒影的图片方法  
  76. */  
  77. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {   
  78.    final int reflectionGap = 4;   
  79.    int width = bitmap.getWidth();   
  80.    int height = bitmap.getHeight();   
  81.   
  82.    Matrix matrix = new Matrix();   
  83.    matrix.preScale(1, -1);   
  84.   
  85.    Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false);   
  86.   
  87.    Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);   
  88.   
  89.    Canvas canvas = new Canvas(bitmapWithReflection);   
  90.    canvas.drawBitmap(bitmap, 00null);   
  91.    Paint deafalutPaint = new Paint();   
  92.    canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);   
  93.   
  94.    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);   
  95.   
  96.    Paint paint = new Paint();   
  97.    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff0x00ffffff, TileMode.CLAMP);   
  98.    paint.setShader(shader);   
  99.    // Set the Transfer mode to be porter duff and destination in   
  100.    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));   
  101.    // Draw a rectangle using the paint with our linear gradient   
  102.    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);   
  103.    return bitmapWithReflection;   
  104. }   
  105. }  
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;
/**
* 
* @author superdev
* @version 1.0
*
*/
public class ImageUtil {

/**
* 放大缩小图片
*/
public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
   int width = bitmap.getWidth();
   int height = bitmap.getHeight();
   Matrix matrix = new Matrix();
   float scaleWidht = ((float) w / width);
   float scaleHeight = ((float) h / height);
   matrix.postScale(scaleWidht, scaleHeight);
   Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
   return newbmp;
}

/**
* 将Drawable转化为Bitmap
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
   int width = drawable.getIntrinsicWidth();
   int height = drawable.getIntrinsicHeight();
   Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
   Canvas canvas = new Canvas(bitmap);
   drawable.setBounds(0, 0, width, height);
   drawable.draw(canvas);
   return bitmap;

}

/**
* 获得圆角图片的方法
*/
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {

   Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
   Canvas canvas = new Canvas(output);

   final int color = 0xff424242;
   final Paint paint = new Paint();
   final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
   final RectF rectF = new RectF(rect);

   paint.setAntiAlias(true);
   canvas.drawARGB(0, 0, 0, 0);
   paint.setColor(color);
   canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

   paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
   canvas.drawBitmap(bitmap, rect, rect, paint);

   return output;
}

/**
* 获得带倒影的图片方法
*/
public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
   final int reflectionGap = 4;
   int width = bitmap.getWidth();
   int height = bitmap.getHeight();

   Matrix matrix = new Matrix();
   matrix.preScale(1, -1);

   Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false);

   Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);

   Canvas canvas = new Canvas(bitmapWithReflection);
   canvas.drawBitmap(bitmap, 0, 0, null);
   Paint deafalutPaint = new Paint();
   canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);

   canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

   Paint paint = new Paint();
   LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
   paint.setShader(shader);
   // Set the Transfer mode to be porter duff and destination in
   paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
   // Draw a rectangle using the paint with our linear gradient
   canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);
   return bitmapWithReflection;
}
}
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, 00null );//在 0,0坐标开始画入src   
  40.         //draw watermark into   
  41.         cv.drawBitmap( watermark, w - ww + 5, h - wh + 5null );//在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.     }  
private byte[] Bitmap2Bytes(Bitmap bm){
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
   return baos.toByteArray();
}
private Bitmap Bytes2Bimap(byte[] b){
		    if(b.length!=0){
		    	return BitmapFactory.decodeByteArray(b, 0, b.length);
		    }
		    else {
		    	return null;
		    }
	  }

 /**
     * create the bitmap from a byte array
     *生成水印图片
     * @param src the bitmap object you want proecss
     * @param watermark the water mark above the src
     * @return return a bitmap object ,if paramter's length is 0,return null
     */
    private Bitmap createBitmap( Bitmap src, Bitmap watermark )
    {
        String tag = "createBitmap";
        Log.d( tag, "create a new bitmap" );
        if( src == null )
        {
            return null;
        }
 
        int w = src.getWidth();
        int h = src.getHeight();
        int ww = watermark.getWidth();
        int wh = watermark.getHeight();
        //create the new blank bitmap
        Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个新的和SRC长度宽度一样的位图
        Canvas cv = new Canvas( newb );
        //draw src into
        cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src
        //draw watermark into
        cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印
        //save all clip
        cv.save( Canvas.ALL_SAVE_FLAG );//保存
        //store
        cv.restore();//存储
        return newb;
    }
   /** 重新编码Bitmap
   * 
   * @param src
   *          需要重新编码的Bitmap
   *
   * @param format
   *          编码后的格式(目前只支持png和jpeg这两种格式)
   *
   * @param quality
   *          重新生成后的bitmap的质量
   *
   * @return
   *          返回重新生成后的bitmap
   */
 private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
                                    int quality) {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            src.compress(format, quality, os);            

            byte[] array = os.toByteArray();
            return BitmapFactory.decodeByteArray(array, 0, array.length);
        }

//Stream转换成Byte
static byte[] streamToBytes(InputStream is) {
      ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
      byte[] buffer = new byte[1024];
      int len;
      try {
             while ((len = is.read(buffer)) >= 0) {
             os.write(buffer, 0, len);
             }
          } catch (java.io.IOException e) {

          }
          return os.toByteArray();
}
//把View转换成Bitmap

    /**
     * 把一个View的对象转换成bitmap
     */
    static Bitmap getViewBitmap(View v) {
    	
        v.clearFocus();
        v.setPressed(false);

        //能画缓存就返回false
        boolean willNotCache = v.willNotCacheDrawing();
        v.setWillNotCacheDrawing(false); 
        int color = v.getDrawingCacheBackgroundColor();
        v.setDrawingCacheBackgroundColor(0);
        if (color != 0) {
            v.destroyDrawingCache();
        }
        v.buildDrawingCache();
        Bitmap cacheBitmap = v.getDrawingCache();
        if (cacheBitmap == null) {
            Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException());
            return null;
        }
        Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);
        // Restore the view
        v.destroyDrawingCache();
        v.setWillNotCacheDrawing(willNotCache);
        v.setDrawingCacheBackgroundColor(color);
        return bitmap;
    }

扫描二维码关注公众号,回复: 548603 查看本文章
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);  
读取raw资源文件中的mp3文件,然后通过音乐播放器播放:

	/**
	 * 把mp3文件写入卡
	 * 
	 * @param fileName
	 *             输出的文件名(全路径)
	 * @param context
         *             context对象
	 */
	private void writeMP3ToSDcard(String fileName, Context context) {
		byte[] buffer = new byte[1024 * 8];
		int read;
		BufferedInputStream bin = new BufferedInputStream(context.getResources().openRawResource(R.raw.ring));
		try {
			BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(fileName));
			while ((read = bin.read(buffer)) > -1) {
				bout.write(buffer, 0, read);
			}
			bout.flush();
			bout.close();
			bin.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(newFile("XXXXmp3的文件全路径")),"audio/*");
startActivity(intent);



绘制图像倒影

Java代码 复制代码  收藏代码
  1. private void     
  2. _Init()      
  3. {      
  4.   m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);      
  5.   LinearGradient lg = new LinearGradient(      
  6.     000, m_nShadowH,       
  7.     0xB0FFFFFF0x00000000,      
  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(00, nW, m_nShadowH, m_paint);      
  54.   canvas.restore();      
  55. }    
private void  
_Init()   
{   
  m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);   
  LinearGradient lg = new LinearGradient(   
    0, 0, 0, m_nShadowH,    
    0xB0FFFFFF, 0x00000000,   
    Shader.TileMode.CLAMP);   
  m_paint.setShader(lg);   
  m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));   
}   
  
@Override protected void    
onDraw(Canvas canvas)   
{   
  super.onDraw(canvas);   
  
  int nX = 0;   
  int nY = 20;   
  
  _DrawNormalImg(canvas, nX, nY);   
  _DrawMirror(canvas, nX, nY);   
}    
  
private void  
_DrawNormalImg(Canvas canvas, int nX, int nY)   
{   
  canvas.save(Canvas.MATRIX_SAVE_FLAG);   
  canvas.translate(nX, nY);      
  m_dw.draw(canvas);   
  canvas.restore();   
}   
  
private void  
_DrawMirror(Canvas canvas, int nX, int nY)   
{   
  int nW = m_dw.getIntrinsicWidth();   
  int nH = m_dw.getIntrinsicHeight();   
  
  ///////////////////////////////////   
  //draw mirror image   
  canvas.save(Canvas.MATRIX_SAVE_FLAG);   
  canvas.scale(1.0f, -1.0f);   
  canvas.translate(nX, -(nY + nH * 2));   
  canvas.clipRect(0, nH, nW, nH - m_nShadowH);   
  m_dw.draw(canvas);   
  canvas.restore();   
  
  //////////////////////////////   
  //draw mask   
  canvas.save();   
  canvas.translate(nX, nY + nH);   
  canvas.drawRect(0, 0, nW, m_nShadowH, m_paint);   
  canvas.restore();   
}  


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



http://blog.csdn.net/Android_Tutor/archive/2010/11/02/5981753.aspx

http://www.cnblogs.com/TerryBlog/archive/2012/01/08/2316482.html

android常用图片特效处理
http://www.eoeandroid.com/thread-170526-1-1.html

相机(Camera)实时滤镜效果
http://www.eoeandroid.com/thread-171528-1-1.html

Android, WindowsPhone7, IOS ,vc2010平台40多套图片滤镜开源
http://www.cnblogs.com/daizhj/archive/2012/05/15/2501406.html

Android实现获取本机中所有图片
http://www.cnblogs.com/hanyonglu/archive/2012/05/10/2494908.html

  • 大小: 37.3 KB
  • 大小: 20 KB
  • 大小: 33 KB

猜你喜欢

转载自1575978975.iteye.com/blog/2109534