آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

XXXXXXX  9 سال پیش  5 سال پیش
+2 0

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

 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
محسن  9 سال پیش
+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);
}
0 0
کد جالبی بود ، میشه ، ممنون میشم یک توضیحاتی راجع به نحوی عملکرد این کد بدید (9 سال پیش)
0 0
خودمم پیداش کردم توضیحات آنچنانی نداره، میتونید به این لینک مراجعه کنید :) لینک (9 سال پیش)
0 0
این کد تمام پیکسل های عکس رو میگیره و با الگوریتم خودش ، Alfa رو به تمام رنگ ها اضافه میکنه تا عکس بلور بشه! روش جالبیه (9 سال پیش)
0 0
(8 سال پیش)
0 0
سلام این الگوریتم برای برنامه هایی که سرعت کار براشون مهمه بسیار کند عمل می کنه ... اصلا توصیه نمیشه (5 سال پیش)
پاسخ به سوال 
Hossein Rezaei  9 سال پیش
+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();
}

}

}

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


سورس برنامه

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

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