1. 程式人生 > >把一張特別大的圖片,分成幾十張小的圖片,在最短的時間內給處理?

把一張特別大的圖片,分成幾十張小的圖片,在最短的時間內給處理?

說到圖片切塊,首先想到的是拼圖遊戲,在載入圖片的時候回進行圖片切塊操作,增加難度的時候會再一次進行切塊操作,不同的是切塊的數量會更多。

首先來看一下拼圖演算法

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. //拼圖
  2. publicstatic Bitmap Pintu(Bitmap bitmap){  
  3.     int w = bitmap.getWidth();  
  4.     int h = bitmap.getHeight();  
  5.     Bitmap resultBitmap = Bitmap.createBitmap(w - 4, h - 4, Bitmap.Config.ARGB_8888);  
  6.     List<ImagePiece> mItemBitmaps;  
  7.     //切圖 3*3    得到9個碎片
  8.     mItemBitmaps = ImageSplitterUtil.splitImage(bitmap, 3);  
  9.     List<ImagePiece> imagePieces = new ArrayList<ImagePiece>();  
  10.     Canvas cv = new Canvas(resultBitmap);  
  11.     int pieceWidth = w / 3;  
  12.     int pieceHeight = h / 3;  
  13.     int w2 = 0;  
  14.     int h2 = 0;  
  15.     //對每個碎片隨機產生一種效果,並儲存到陣列中
  16.     for(int s = 0; s < mItemBitmaps.size(); s++){  
  17.         int type = (int) (Math.random() * 13);  
  18.         Bitmap tempBitmap = mItemBitmaps.get(s).getBitmap();  
  19.         ImagePiece imagePiece = new ImagePiece();  
  20.         imagePiece.setBitmap(pintu(tempBitmap, type));  
  21.         imagePieces.add(imagePiece);  
  22.     }  
  23.     //在畫布上將每個經過處理後的碎片重新繪製到畫布上
  24.     for(int i = 0; i < imagePieces.size(); i++){  
  25.         if(i == 3 || i == 6){  
  26.             w2 = w2 + pieceWidth - 2;  
  27.             h2 = 0;  
  28.         }elseif(i != 0){  
  29.             h2 += pieceHeight - 2;  
  30.         }  
  31.         cv.drawBitmap(imagePieces.get(i).getBitmap(), w2, h2, null);  
  32.         cv.save(Canvas.ALL_SAVE_FLAG);  
  33.         cv.restore();                         
  34.     }                 
  35.     return resultBitmap;  
  36. }  
  //拼圖
    public static Bitmap Pintu(Bitmap bitmap){
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Bitmap resultBitmap = Bitmap.createBitmap(w - 4, h - 4, Bitmap.Config.ARGB_8888);

        List<ImagePiece> mItemBitmaps;
        //切圖 3*3    得到9個碎片
        mItemBitmaps = ImageSplitterUtil.splitImage(bitmap, 3);

        List<ImagePiece> imagePieces = new ArrayList<ImagePiece>();

        Canvas cv = new Canvas(resultBitmap);
        int pieceWidth = w / 3;
        int pieceHeight = h / 3;

        int w2 = 0;
        int h2 = 0;

        //對每個碎片隨機產生一種效果,並儲存到陣列中
        for(int s = 0; s < mItemBitmaps.size(); s++){
            int type = (int) (Math.random() * 13);

            Bitmap tempBitmap = mItemBitmaps.get(s).getBitmap();
            ImagePiece imagePiece = new ImagePiece();

            imagePiece.setBitmap(pintu(tempBitmap, type));
            imagePieces.add(imagePiece);
        }

        //在畫布上將每個經過處理後的碎片重新繪製到畫布上
        for(int i = 0; i < imagePieces.size(); i++){
            if(i == 3 || i == 6){
                w2 = w2 + pieceWidth - 2;
                h2 = 0;
            }else if(i != 0){
                h2 += pieceHeight - 2;
            }
            cv.drawBitmap(imagePieces.get(i).getBitmap(), w2, h2, null);
            cv.save(Canvas.ALL_SAVE_FLAG);
            cv.restore();                       
        }               
        return resultBitmap;
    }
其中的ImagePiece類如下: [java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.hqu.cst.imageedit.util;  
  2. import android.graphics.Bitmap;  
  3. /** 
  4.  * 圖片碎片類 
  5.  * @author KaipingZhou 
  6.  * 
  7.  */
  8. publicclass ImagePiece  
  9. {  
  10.     private Bitmap bitmap ;   
  11.     public ImagePiece(){  
  12.     }  
  13.     public ImagePiece(Bitmap bitmap){  
  14.         this.bitmap = bitmap;  
  15.     }  
  16.     public Bitmap getBitmap(){  
  17.         return bitmap;  
  18.     }  
  19.     publicvoid setBitmap(Bitmap bitmap){  
  20.         this.bitmap = bitmap;  
  21.     }     
  22. }  
package com.hqu.cst.imageedit.util;

import android.graphics.Bitmap;

/**
 * 圖片碎片類
 * @author KaipingZhou
 *
 */

public class ImagePiece
{
    private Bitmap bitmap ; 

    public ImagePiece(){
    }

    public ImagePiece(Bitmap bitmap){
        this.bitmap = bitmap;
    }

    public Bitmap getBitmap(){
        return bitmap;
    }

    public void setBitmap(Bitmap bitmap){
        this.bitmap = bitmap;
    }   
}
在進行拼圖遊戲的時候也可以用到這個類,還可以增加很多方法。

另外的splitImage方法如下:

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. package com.hqu.cst.imageedit.util;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import android.graphics.Bitmap;  
  5. /** 
  6.  * 圖片切塊工具 
  7.  * @author KaipingZhou 
  8.  * 
  9.  */
  10. publicclass ImageSplitterUtil  
  11. {  
  12.     /** 
  13.      * @param bitmap 
  14.      * @param piece 
  15.      *            切成piece*piece塊 
  16.      * @return List<ImagePiece> 
  17.      */
  18.     publicstatic List<ImagePiece> splitImage(Bitmap bitmap, int piece)  
  19.     {  
  20.         List<ImagePiece> imagePieces = new ArrayList<ImagePiece>();  
  21.         int width = bitmap.getWidth();  
  22.         int height = bitmap.getHeight();  
  23.         int pieceWidth = width / piece;  
  24.         int pieceHeight = height / piece;  
  25.         for (int i = 0; i < piece; i++){  
  26.             for (int j = 0; j < piece; j++){  
  27.                 ImagePiece imagePiece = new ImagePiece();                 
  28.                 int x = i * pieceWidth;  
  29.                 int y = j * pieceHeight;  
  30.                 imagePiece.setBitmap(Bitmap.createBitmap(bitmap, x, y,  
  31.                         pieceWidth, pieceHeight));  
  32.                 imagePieces.add(imagePiece);  
  33.             }  
  34.         }  
  35.         return imagePieces;  
  36.     }  
  37. }  
package com.hqu.cst.imageedit.util;

import java.util.ArrayList;
import java.util.List;
import android.graphics.Bitmap;

/**
 * 圖片切塊工具
 * @author KaipingZhou
 *
 */

public class ImageSplitterUtil
{
    /**
     * @param bitmap
     * @param piece
     *            切成piece*piece塊
     * @return List<ImagePiece>
     */
    public static List<ImagePiece> splitImage(Bitmap bitmap, int piece)
    {
        List<ImagePiece> imagePieces = new ArrayList<ImagePiece>();

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        int pieceWidth = width / piece;
        int pieceHeight = height / piece;

        for (int i = 0; i < piece; i++){
            for (int j = 0; j < piece; j++){
                ImagePiece imagePiece = new ImagePiece();               

                int x = i * pieceWidth;
                int y = j * pieceHeight;

                imagePiece.setBitmap(Bitmap.createBitmap(bitmap, x, y,
                        pieceWidth, pieceHeight));
                imagePieces.add(imagePiece);
            }
        }
        return imagePieces;
    }
}
這個方法不是死的,通過傳入切塊的數量去動態的調整切塊的大小。

其中ImagePiece.setBitmap(pintu(tempBitmap, type));其中拼圖方法就是集合了幾種不同濾鏡的一個方法。

其效果如下:


效果並不是美觀,是因為我的pintu()方法中的濾鏡種類比較多,而且顏色差異比較大,如果只選擇兩種到四種濾鏡,效果應該會好很多。