بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

بلر یا بلور کردن عکس

مدیریت گفتگو
XXXXXXX 12 سال پیش
آخرین تغییر: 7 سال پیش

سلام دوستان . چند وقت پیش هم این سوالو کردم از دوستان خواهشی دارم که اگه چنین چیزی رو بلدند همینجا بگن  که چجوری یه عکسو میشه گرفت بعد بلورش کرد ذخیرش کرد تو Sdcard و بعد نمایشش داد تو یه imageview  .اگه سورسی چیزی دارید بذارید . پیشاپیش دمتون گرم . :D

نظرات

پاسخ‌ها 2

محسن 12 سال پیش

اول از صفحه اسکرین شات بگیر بعد با این کد بلرش کن و بندازش رو صفحه

 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);
}

نظرات

Hajhosseini 12 سال پیش
کد جالبی بود ، میشه ، ممنون میشم یک توضیحاتی راجع به نحوی عملکرد این کد بدید
محسن 12 سال پیش
خودمم پیداش کردم توضیحات آنچنانی نداره، میتونید به این لینک مراجعه کنید :) لینک
Hajhosseini 12 سال پیش
این کد تمام پیکسل های عکس رو میگیره و با الگوریتم خودش ، Alfa رو به تمام رنگ ها اضافه میکنه تا عکس بلور بشه! روش جالبیه
jabi 7 سال پیش
سلام این الگوریتم برای برنامه هایی که سرعت کار براشون مهمه بسیار کند عمل می کنه ... اصلا توصیه نمیشه
Hossein Rezaei 12 سال پیش

این کلاس:
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();
}

}

}

حاصل اجرای کد بالا هم به این شکل خواهد شد:


سورس برنامه

نظرات

XXXXXXX 12 سال پیش
دمت گرم حاجی فقط یه مشکلی داره از Options خطا میگیره !!!
XXXXXXX 12 سال پیش
البته دو سه تا مشکلش ماله نذاشتن = و اشتباه اسمی opti به جای option بود اما هنوز از متد Options خطا میگیره تو این خط : final BitmapFactory.Options opti =BitmapFactory.Options();
Hossein Rezaei 12 سال پیش
من این کد رو از eclipse پس از اینکه خودم اجرا گرفتم کپی کردم،پس اصولا نباید مشکلی داشته باشه
Hossein Rezaei 12 سال پیش
کد رو دوباره گذاشتم، ببینید جواب میده؟
XXXXXXX 12 سال پیش
این که همون کده!
XXXXXXX 12 سال پیش
اگه میشه سورسشو بفرستید منم امتحان کنم
Hossein Rezaei 12 سال پیش
اکی، فقط چطوری میشه سورس رو توو سایت آپلود کرد؟
XXXXXXX 12 سال پیش
خود سایت که فکر نکنم داشته باشه اما اپلود سرور آقای دادپرور هست : لینک
Hossein Rezaei 12 سال پیش
عجیبه اما الان که دقت کردم دیدم سایت سورسی رو که گذاشتم بهم میریزه! الان چند باره هم که کپی پیست میکنم، وقتی سیو میکنم همون خطی که میگید دوباره بهم میریزه، یعنی همون غلط املایی پیدا میکنه و مساوی و ... هم حذف میشه!
XXXXXXX 12 سال پیش
عجیبه ! دانلود نمیشه . میشه لینکو چک کنید ؟
Hossein Rezaei 12 سال پیش
مثل اینکه باید حتما عضو آپلود سنتر آقای دادپرور باشید تا اجازه دانلود بده! منم تست کردم اول اجازه دانلود نمیداد اما به محض اینکه وارد شدم لینکش عمل کرد
XXXXXXX 12 سال پیش
مرسی . الان دانلودش کردم اما وقتی برنامه رو run میکنم هیچ اتفاقی نمیفته .
Hossein Rezaei 12 سال پیش
عجیبه! حتما eclipse یا adb ت ی مشکلی دارن چون واسه من که کار میکنه! پروژه رو درست ایمپورت کردی؟برنامه که ارور نداره؟
XXXXXXX 12 سال پیش
اره پروژه رو درست ایمپورت کردم برنامه هم ارور نداره
Hossein Rezaei 12 سال پیش
میتونی تیکه کدی رو که نیاز داری از داخلش کپی کنی توو برنامه خودت، ببین جواب میده یا نه
XXXXXXX 12 سال پیش
باشه . مرسی از اینکه وقتتو گذاشتی و کمکم کردی .
Hossein Rezaei 12 سال پیش
خواهش میکنم. موفق باشی...
XXXXXXX 12 سال پیش
اینکه عکسو تا سر حد مرگ کوچیک و بی کیفیت میکنه !

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .