#android #bitmap #filter
#Android #растровое изображение #Фильтр
Вопрос:
Привет, мне нужно создать эффект мозаики в Android.
Преобразуйте это:
К этому:
Как я могу это сделать? Спасибо
Комментарии:
1. вы пробовали:
android:tileMode="repeat"
в<bitmap>
2. @Prag Я хочу применить эффект к растровому изображению. вы упомянули о повторении изображения.
Ответ №1:
/**
* 效果能实现,但是是个耗时的操作
*
* @param bmp
* @param precent 马赛克的程度(0-1)
* 300*300 precent=1 time=57ms
* @return
*/
public static Bitmap getMosaicsBitmap(Bitmap bmp, double precent) {
long start = System.currentTimeMillis();
int bmpW = bmp.getWidth();
int bmpH = bmp.getHeight();
Bitmap resultBmp = Bitmap.createBitmap(bmpW, bmpH, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(resultBmp);
Paint paint = new Paint();
double unit;
if (precent == 0) {
unit = bmpW;
} else {
unit = 1 / precent;
}
double resultBmpW = bmpW / unit;
double resultBmpH = bmpH / unit;
for (int i = 0; i < resultBmpH; i ) {
for (int j = 0; j < resultBmpW; j ) {
int pickPointX = (int) (unit * (j 0.5));
int pickPointY = (int) (unit * (i 0.5));
int color;
if (pickPointX >= bmpW || pickPointY >= bmpH) {
color = bmp.getPixel(bmpW / 2, bmpH / 2);
} else {
color = bmp.getPixel(pickPointX, pickPointY);
}
paint.setColor(color);
canvas.drawRect((int) (unit * j), (int) (unit * i), (int) (unit * (j 1)), (int) (unit * (i 1)), paint);
}
}
canvas.setBitmap(null);
long end = System.currentTimeMillis();
Log.v(TAG, "DrawTime:" (end - start));
return resultBmp;
}
/**
* 和上面的函数同样的功能,效率远高于上面
*
* @param bmp
* @param precent
* @return
*/
public static Bitmap getMosaicsBitmaps(Bitmap bmp, double precent) {
long start = System.currentTimeMillis();
int bmpW = bmp.getWidth();
int bmpH = bmp.getHeight();
int[] pixels = new int[bmpH * bmpW];
bmp.getPixels(pixels, 0, bmpW, 0, 0, bmpW, bmpH);
int raw = (int) (bmpW * precent);
int unit;
if (raw == 0) {
unit = bmpW;
} else {
unit = bmpW / raw; //原来的unit*unit像素点合成一个,使用原左上角的值
}
if (unit >= bmpW || unit >= bmpH) {
return getMosaicsBitmap(bmp, precent);
}
for (int i = 0; i < bmpH; ) {
for (int j = 0; j < bmpW; ) {
int leftTopPoint = i * bmpW j;
for (int k = 0; k < unit; k ) {
for (int m = 0; m < unit; m ) {
int point = (i k) * bmpW (j m);
if (point < pixels.length) {
pixels[point] = pixels[leftTopPoint];
}
}
}
j = unit;
}
i = unit;
}
long end = System.currentTimeMillis();
Log.v(TAG, "DrawTime:" (end - start));
return Bitmap.createBitmap(pixels, bmpW, bmpH, Bitmap.Config.ARGB_8888);
}
если вы хотите изменить растровое изображение на растровое изображение мозаики, просто вызовите функцию
getMosaicsBitmaps(bmp,0.1)