بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
بلر یا بلور کردن عکس
سلام دوستان . چند وقت پیش هم این سوالو کردم از دوستان خواهشی دارم که اگه چنین چیزی رو بلدند همینجا بگن که چجوری یه عکسو میشه گرفت بعد بلورش کرد ذخیرش کرد تو Sdcard و بعد نمایشش داد تو یه imageview .اگه سورسی چیزی دارید بذارید . پیشاپیش دمتون گرم . :D
برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال
محسن
10 سال پیش
+7
0
اول از صفحه اسکرین شات بگیر بعد با این کد بلرش کن و بندازش رو صفحه
public static Bitmap fastblur(Bitmap sentBitmap, int radius) {
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
if (radius < 1) {
return (null);
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
Log.e("pix", w + " " + h + " " + pix.length);
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;
int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) >> 1;
divsum *= divsum;
int dv[] = new int[256 * divsum];
for (i = 0; i < 256 * divsum; i++) {
dv[i] = (i / divsum);
}
yw = yi = 0;
int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;
for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;
for (x = 0; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi += w;
}
}
Log.e("pix", w + " " + h + " " + pix.length);
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
}
خودمم پیداش کردم توضیحات آنچنانی نداره، میتونید به این لینک مراجعه کنید :) لینک (10 سال پیش)
پاسخ به سوال
Hossein Rezaei
10 سال پیش
+8
0
این کلاس:
1-عکس رو از پوشه drawable میخونه
2-فیلتر blur رو روی عکس اعمال میکنه
3-عکس روی SD Card ذخیره میکنه
4-پس از ذخیره تصویر blur شده، برای اطمینان از درستی عمل ذخیره شدن، یکبار اونو نمایش میده
** لینک سورس برنامه نیز در آخر این پاسخ موجود است**
package hekatom.soft.app.testBluringImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ImageView;
public class ActivityMain extends Activity {
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static String dirName = "ImagesFolder";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
File ImagesDirectory = new File(DIR_SDCARD + "/" + dirName);
if ( !ImagesDirectory.exists()) {
ImagesDirectory.mkdir();
}
ImageView imgOriginalImage = (ImageView) findViewById(R.id.imgOriginalImage);
ImageView imgBlurImage = (ImageView) findViewById(R.id.imgBlurImage);
ImageView imgFromSD = (ImageView) findViewById(R.id.imgFromSD);
//read original image from drawable and conver to bitmap
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.img1);
imgOriginalImage.setImageBitmap(bitmap);
//apply bluring filter to image
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 16;
Bitmap blurTemplate = BitmapFactory.decodeResource(getResources(), R.drawable.img1, options);
imgBlurImage.setImageBitmap(blurTemplate);
//save bluring image to SD Card
saveBitmap(blurTemplate, ImagesDirectory);
//testing saved image
File f = new File(ImagesDirectory + "/BluringImage.png");
Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath());
imgFromSD.setImageBitmap(bmp);
}
public void saveBitmap(Bitmap bmp, File ImagesDirectory)
{
File file = new File(ImagesDirectory, "BluringImage.png");
FileOutputStream fOut;
try {
fOut = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
حاصل اجرای کد بالا هم به این شکل خواهد شد:
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .