کد جالبی بود ، میشه ، ممنون میشم یک توضیحاتی راجع به نحوی عملکرد این کد بدید
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
بلر یا بلور کردن عکس
مدیریت گفتگو
آخرین تغییر: 7 سال پیش
سلام دوستان . چند وقت پیش هم این سوالو کردم از دوستان خواهشی دارم که اگه چنین چیزی رو بلدند همینجا بگن که چجوری یه عکسو میشه گرفت بعد بلورش کرد ذخیرش کرد تو Sdcard و بعد نمایشش داد تو یه imageview .اگه سورسی چیزی دارید بذارید . پیشاپیش دمتون گرم . :D
پاسخها 2
اول از صفحه اسکرین شات بگیر بعد با این کد بلرش کن و بندازش رو صفحه
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);
}
نظرات
خودمم پیداش کردم توضیحات آنچنانی نداره، میتونید به این لینک مراجعه کنید :) لینک
این کد تمام پیکسل های عکس رو میگیره و با الگوریتم خودش ، Alfa رو به تمام رنگ ها اضافه میکنه تا عکس بلور بشه! روش جالبیه
سلام این الگوریتم برای برنامه هایی که سرعت کار براشون مهمه بسیار کند عمل می کنه ... اصلا توصیه نمیشه
این کلاس:
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();
}
}
}
حاصل اجرای کد بالا هم به این شکل خواهد شد:

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