把一張特別大的圖片,分成幾十張小的圖片,在最短的時間內給處理?
阿新 • • 發佈:2019-01-28
說到圖片切塊,首先想到的是拼圖遊戲,在載入圖片的時候回進行圖片切塊操作,增加難度的時候會再一次進行切塊操作,不同的是切塊的數量會更多。
首先來看一下拼圖演算法:
[java] view plain copy print?- //拼圖
- publicstatic 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;
- }elseif(i != 0){
- h2 += pieceHeight - 2;
- }
- cv.drawBitmap(imagePieces.get(i).getBitmap(), w2, h2, null);
- cv.save(Canvas.ALL_SAVE_FLAG);
- cv.restore();
- }
- return resultBitmap;
- }
//拼圖
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?- package com.hqu.cst.imageedit.util;
- import android.graphics.Bitmap;
- /**
- * 圖片碎片類
- * @author KaipingZhou
- *
- */
- publicclass ImagePiece
- {
- private Bitmap bitmap ;
- public ImagePiece(){
- }
- public ImagePiece(Bitmap bitmap){
- this.bitmap = bitmap;
- }
- public Bitmap getBitmap(){
- return bitmap;
- }
- publicvoid setBitmap(Bitmap bitmap){
- this.bitmap = bitmap;
- }
- }
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?- package com.hqu.cst.imageedit.util;
- import java.util.ArrayList;
- import java.util.List;
- import android.graphics.Bitmap;
- /**
- * 圖片切塊工具
- * @author KaipingZhou
- *
- */
- publicclass ImageSplitterUtil
- {
- /**
- * @param bitmap
- * @param piece
- * 切成piece*piece塊
- * @return List<ImagePiece>
- */
- publicstatic 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;
- }
- }
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()方法中的濾鏡種類比較多,而且顏色差異比較大,如果只選擇兩種到四種濾鏡,效果應該會好很多。