ပံုထဲက လိုမ်ိဳး ကိုယ့္ Apps မွာ ပံုကို ဝါးေအာင္ဘယ္လိုၾကမလဲ...
Step 1. အရင္ဆံုး Project အသစ္တစ္ခုယူပါ။
Step 2. ၿပီးရင္ xml မွာ ImageView တစ္ခုထည့္ပါ။ ဘယ္လို Attribute ေတြနဲ႔ေရးရမွန္းမသိရင္ ေအာက္မွာ က်ေနာ္ေပးတဲ့ Code နဲ႔ပဲေရးလိုက္ပါ။
<ImageView
android:id="@+id/imgView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
အဲဟာနဲ႔ေရးၿပီးၿပီဆိုရင္ Java file သြားပါမယ္။
Step 3. Java file မွာ Global အေနနဲ႔ ImageView Object တစ္ခုရယ္။ Blur ဆိုတဲ့ Object တစ္ခုေဆာက္ပါ... ႀကိဳက္ရာနာမည္ေပးပါ။ ImageView ဆိုတဲ့ Object ေဆာက္တဲ့အခ်ိန္မွာ import လုပ္ေပးပါလိမ့္မယ္။ သူက Original import ပါၿပီးသားပါ။ Blur ဆိုတဲ့ Object ေဆာက္တဲ့အခ်ိန္ import မလုပ္ေပးပါဘူး။ ဘာလို႔ import မလုပ္ေပးလဲဆိုရင္ သူက က်ေနာ္တို႔ကိုယ္တိုင္ java file ေရးရမွာျဖစ္တဲ့အတြက္ပါ။ အဲအတြက္ error တက္လဲ ခနထားတာပါ။ ဘာမွမျဖစ္ပါဘူး။က်ေနာ္က ဒီလိုေၾကညာလိုက္ပါတယ္။
ImageView img;
Blur blur;
Step 4. OnCreate Method ထဲမွာ ImageView ကို id ခ်ိတ္ပါ။ Blur object ကို new ေခၚပါ။ က်ေနာ္ဘယ္လိုေရးလဲဆိုရင္ေတာ့
img = (ImageView) findViewById(R.id.imgView);
blur = new Blur(this);
အဲလိုေၾကညာၿပီးၿပီဆိုရင္။ အခုေနာက္တစ္ဆင့္ထပ္သြားပါမယ္ယ။
Step 5. အခုအဆင့္က ပံုထည့္ၿပီး ပံုကိုဝါးဖို႔အဆင့္ပါ။ အဲအတြက္ ပံုထည့္ပါမယ္။ ပံုမထည့္ခင္ ကိုယ္က ဝါးမဲ့ပံုကို drawable folder ေအာက္ထဲႀကိဳထည့္ေပးထားဖို႔မေမ့နဲ႔ေနာ္။ က်ေနာ္က ပံုကိုထည့္ၿပီး ပံုနာမည္ကို kyawhtut.jpg လို႔ေပးထားလိုက္တယ္။ အခု ပံုထည့္ပါမယ္။ က်ေနာ္တို႔အရင္က ပံုကို imageview ထဲထည့္ဖို႔ java မွာဘာ method သံုးလဲဆိုရင္ .setImageResource(); ဆိုတဲ့ method သံုးပါတယ္။ အခုက အဲ method မသံုးပါဘူး။ ဘာလို႔မသံုးထာလဲဆိုရင္ အခုက ပံုကို ကိုယ္က ဝါးလိုက္မွာဆိုေတာ့ပံုျပင္လိုက္ရၿပီ။ အဲအတြက္ ပံုကိုျပင္လိုက္ရင္ သူက ဘာပဲ return ျပန္တယ္ဆိုရင္ Bitmap ဆိုတဲ့ object တစ္ခု return ျပန္ေပးပါတယ္။ အဲအတြက္ အဲ bitmap ကို imgview ထဲဘယ္လိုထည့္မလဲဆိုရင္ အခုလိုထည့္ပါတယ္။ မထည္ခင္ က်ေနာ္တို႔က ျပန္လာမဲ့ object ကိုလက္ခံဖို႔လိုပါေသးတယ္။ အဲအတြက္ လက္ခံမဲ့ေကာင္ကိုေဆာက္ရပါမယ္။ လက္ခံမဲ့ေကာင္က ျပန္လာမဲ့ေကာင္နဲ႔ အမ်ိဳးအစားခ်င္းတူရပါမယ္။ ျပန္လာမွာက Bitmap အမ်ိဳးအစားျဖစ္တဲ့အတြက္ Bitmap ဆိုတဲ့ Object တစ္ခုေဆာက္ပါတယ္။
Bitmap bitmap;
ေဆာက္ၿပီးရင္ အဲ bitmap ထဲကို data ထည့္ပါမယ္။ data က ဟို blur ဆိုတဲ့ object class ကပိုင္ဆိုင္တဲ့ ChangeBlur ဆိုတဲ့ Method က ျပန္လာမဲ့ေကာင္ကိုထည့္ရမွာပါ။ အဲအတြက္ ဒီလို data ထည့္ပါတယ္။
bitmap = blur.ChangeBlur(R.drawable.kyawhtut,1,18);
အဲမွာ ChangeBlur ဆိုတဲ့ေကာင္ကိုေခၚတဲ့အခ်ိန္မွာ Argument သံုးခုထည့္ေပးရပါတယ္။ ဘာလို႔ထည့္ေပးရလဲဆိုရင္ သူ႔ကိုေခၚရင္ အဲသံုးခုပါမွေခၚလို႔ရမဲ့ေပါ့။ ဥပမာ လူမိုက္တေယာက္ငွါးမယ္ဆိုရင္ သူေတာင္းတဲ့ေၾကးေပးရတယ္။ သူလိုခ်င္တဲ့ပံုစံနဲ႔ေပးရသလိုေပါ့။
အဲအတြက္ က်ေနာ္တို႔လည္း ChangeBlur ကိုေခၚတဲ့အခ်ိန္ သူလိုခ်င္တဲ့ Argument ၃ ခုေပးလိုက္ပါတယ္။ အမ်ိဳးအစားေတြလြဲလို႔မရဘူးေနာ္။ ပထမ argument က ပံုနာမည္ ဒုတိယ argument က radius တတိယ argument က တန္ဖိုး။
ပံုနာမည္ဆိုတာက ကိုယ္က ဘယ္ပံုကိုဝါးမွာလဲ ဝါးမဲ့ပံုကိုထည့္ေပးရမွာေပါ့။ အဲအတြက္ ဒီလိုေပးရတယ္။ R.drawable.kyawhtut အဲမွာ ေ႐ွ႕က R.drawable. ကပံုေသပါ ေနာက္က kyawhtut ဆိုတာက ကိုဝါးမဲ့ပံုနာမည္ပါ။ အခုက က်ေနာ္က kyawhtut လို႔ေပးတားတဲ့ပံုကိုဝါးမွာျဖစ္တဲ့အတြက္ kyawhtut ဆိုတာကိုေပးလိုက္တယ္။ မိတ္ေဆြတို႔ကေတာ့ ကိုယ့္ပံုနာမည္ကိုယ္ေပးေပါ့။
ဒုတိယ argument က radius ဆိုတာက က်ေနာ္ေတာ့ေသခ်ာမစမ္းရေသးဘူး။ သူက 1 ကစၿပီးေပးလို႔ရတယ္။ 1 ပဲေပးတာသင့္ေတာ္တယ္ထင္တယ္။ အဲအတြက္က်ေနာ္က 1 ပဲေပးတယ္။
တတိယ argument ကတန္ဖိုး ဆိုတာက ကိုက ဘယ္ေလာက္တန္ဖိုးဝါးမွာလဲ။ ဥပမာ ကိုယ္က 1 လို႔ေပးလိုက္ရင္ ပံုက original တိုင္းထြက္မွာေပါ့။ အကယ္၍ကိုယ္က 10 လို႔ေပးလိုက္ရင္ original ပံုထက္ဝါးသြားမယ္ေပါ့။ သူလဲ 1 ကေနစေပးလို႔ရတယ္။ စိတ္ႀကိဳက္ထိေပါ့။ က်ေနာ္ကေတာ့အခု 18 လို႔ေပးထားတယ္။ အဲအတြက္ ေအာက္မွာ ျပထားတဲ့ပံုအတိုင္းဝါးေနတာေပါ့။ ကဲဒါဆိုရင္ ဟိုဘက္က Bitmap အမ်ိဳးအစား data ကို return ျပန္ၿပီး ဒီဘကက္ေန အဲေကာင္ကို လက္ခံၿပီးၿပီ။ အခု လက္ခံထားတဲ့ေကာင္ကို imageview ထဲထည့္ဖို႔ပဲက်န္ေတာ့တယ္။ အခုထည့္က်ရေအာင္ ထည့္ဖို႔က setImageBitmap(); ဆိုတဲ့ method ကိုသံုးတယ္။ သံုးတဲ့ေနရာမွာ သူက 1 argument ထည့္ေပးရတယ္။ ဘာအမ်ိဳးအစားလဲဆိုရင္ Bitmap အမ်ိဳးအစား။ အဲအတြက္ က်ေနာ္တို႔ခုနက လက္ခံထားတဲ့ေကာင္ကို ထည့္ေပးလိုက္ရင္အဆင္ေျပၿပီေပါ့။ အဲအတြက္ဒီလိုေရးတယ္။
img.setImageBitmap(bitmap);
အဲလိုေပါ့။ အခုဆိုနည္းနည္းရႈပ္သြားမယ္ထင္တယ္။ ဘာလို႔လဲဆိုေတာ့ Code ေတြနဲ႔႐ွင္းျပတဲ့စာေတြနဲ႔ေရာေနလိမ့္မယ္။ အဲအတြက္ သီးသန္႔ေရးျပမယ္။ အေပၚမွာက Global ေၾကညာတဲ့ေကာင္က ႐ွင္းတယ္။ OnCreate method ထဲမွာေရးပံုျပမယ္။
img = (ImageView) findViewById(R.id.imgView);
blur = new Blur(this);
Bitmap bitmap = blur.ChangeBlur(R.drawable.kyawhtut,1,18);
img.setImageBitmap(bitmap);
အဲတာဆိုရင္ OnCreate method ထဲမွာၿပီးၿပီေပါ့။ အခု က်န္တာက error တက္ေနတဲ့ Blur ဆိုတဲ့ ေကာင္ကို႐ွင့္ဖို႔ပဲ။ ကဲေနာက္တဆင့္သြားရေအာင္။
Step 5. အခု Blur ဆိုတဲ့ error ႐ွင္းဖို႔အတြက္ src ေအာက္မွာ Java file တစ္ခု create လုပ္ေပးပါ။ နာမည္က Blur ဆိုတဲ့နာမည္နဲ႔ပါ။ ၿပီးရင္ အဲ java file ဖြင့္သြားရင္ အေပၚက package ဘာညာဘာညာ ဆိုတဲ့ စာေၾကာင္းတေၾကာင္း ပဲခ်န္ပါ။ က်န္တာအကုန္ဖ်တ္ပါ။ ၿပီးရင္ အဲခ်န္တားတဲ့ စာေၾကာင္းေအာက္မွာ။ က်ေနာ္ေပးတဲ့ code ကိုအစားထိုးၿပီး Run ေပးပါ။ ဒါဆိုရင္ Peoject တစ္ခုၿပီးသြားပါၿပီ။
Blur.java
Blur.java
/*This java can help you to chnage image into blur image.
If you have no time to change image into blur image by using Photoshop, you can waste your time by using this java you can save your time. And then, you can't lose original photo.
Created By - Kyaw Htut.
Ph - 09786596541 */
import android.content.*;
import android.graphics.*;
import android.util.*;
import android.widget.*;
public class Blur
{
Context context;
public Blur(Context c){
this.context=c;
}
public Bitmap ChangeBlur(int img, float scale, int radius) {
Bitmap sentBitmap = BitmapFactory.decodeResource(context.getResources(), img);
int width = Math.round(sentBitmap.getWidth() * scale);
int height = Math.round(sentBitmap.getHeight() * scale);
sentBitmap = Bitmap.createScaledBitmap(sentBitmap, width, height, false);
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);
}
}
ကဲ ဒါဆိုရင္ Original ပံုကို Photoshop ဖြင့္ၿပီး ဝါးစရာမလိုပဲ Apps မွာတင္ ဝါးလို႔ရၿပီေပါ့။
ေနာက္ဆို ပံုထဲကလို Seekbar ေလးထည့္ၿပီး ကိုယ့္ဟာကို တန္ဖိုးအခ်ံဳးအခ်ဲ့လုပ္လို႔ရၿပီေပါ့။ အခုေတာ့ Seekbar Control ကိုထည့္မေျပာျပထားပါဘူး။ ကိုယ့္ဟာကိုယ္စမ္းၾကည့္က်ေပါ့။ အဆင္မေျပတာမ်ား႐ွိရင္ ment မွာမန္႔ထားႏိုင္ပါတယ္။ အတက္ႏိုင္ဆံုးေျဖ႐ွင္းထားေပးပါမယ္။
အခုလို႐ွင္းျပတာ နားလည္မယ္လို႔ထင္ပါတယ္။
အဆင္ေျပတယ္ဆိုရင္ ေနာက္လူေတြလဲ သိရေအာင္လို႔ တခ်က္ေလာက္ Share သြားေပးဦးေနာ္။
#KyawHtut
အခုလိုအားေပးတ့ဲအတြက္ အထူးေက်းဇူးတင္ပါေၾကာင္း ေျပာျပရပါေစ........ IT Learner & Sharer မွနည္းပညာမ်ားအား မည္သူမဆိုလြတ္လပ္စြာကူးယူသုံးစြဲႏိုင္ပါ ေၾကာင္း.....ကြ်န္ေတာ္ ပိုင္ဆိုင္ေသာေနရာေလးသို႔ လာလည္တဲ့အတြက္ေက်းဇူးတင္ပါသည္။

No comments:
Post a Comment