انتخاب عکس و ایجاد یک نوشته روی عکس و ذخیره اون عکس
سلام همون طور که از تیتر سوال مشخصه میخام یک عکس انتخاب کنم از گالری یا از داخل خود برنامه و بعد روی عکس بنویسم و سپس بتونم عکس رو با اون نوشته در گالری ذخیره کنم . اگه ممکن راهنمایی کنید
با این کد میشه از view مورد نظر اسکرین شات گرفت. اون دوتا 700 هم سایز اسکرین شات گرفته شدس
yourView.setDrawingCacheEnabled(true); Bitmap resizedBitmap = Bitmap.createScaledBitmap(yourView.getDrawingCache(), 700,
700, true);
سلام به کمک این کد گالری رو باز میکنی
Intent pickPhoto = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto, 1);
توسط متد زیر به صورت خودکار عکس انتخاب شده در یک imageview نمایش داده میشه
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Ui ui = new Ui(getWindow().getDecorView());
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
File imageFile = new File(getRealPathFromURI(selectedImageUri));
NameImage = imageFile.getName();
Toast.makeText(G.context, NameImage, Toast.LENGTH_SHORT).show();
selectedImagePath = getPath(selectedImageUri);
System.out.println("Image Path : " + selectedImagePath);
imgImage.setImageURI(selectedImageUri);
} else if (requestCode == SELECT_PICTURE_CAMERA) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
ui.imgImage.setImageBitmap(photo);
}
}
}
وحالا خیلی راحت عکسی که داخل imageview هستو ذخیره کن داخل sdcard....از طریق bitmap
تعریف متغیر ها:
public String NameImage;
private static final int SELECT_PICTURE = 1;
private static final int SELECT_PICTURE_CAMERA = 0;
خودم با این کد میتونم از گالری عکس انتخاب کنم ونمایش بدم اما نمیدونم چه جوری تو دیتابیس ذخیره کنم؟
package ir.selectphtofromgallery.com;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class SelectImageFromGalleryActivity extends Activity {
private static final int SELECT_PICTURE = 1;
Button btnBrowse;
// private String filemanagerstring;
private static int RESULT_LOAD_IMAGE = 1;
// private static int PICK_FROM_GALLERY = 1;
private ImageView img2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
img2 = (ImageView) findViewById(R.id.img);
btnBrowse = (Button) findViewById(R.id.bnBrowse);
btnBrowse.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent pickPhoto = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView imageView = (ImageView) findViewById(R.id.img);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
imageView.setMaxHeight(500);
imageView.setMaxWidth(500);
}
}
}
اینو ببین
package ir.selectphtofromgallery.com;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class SelectImageFromGalleryActivity extends Activity {
private static final int SELECT_PICTURE = 1;
Button btnBrowse;
Button btnSave;
// private String filemanagerstring;
private static int RESULT_LOAD_IMAGE = 1;
// private static int PICK_FROM_GALLERY = 1;
private ImageView img2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
img2 = (ImageView) findViewById(R.id.img);
btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (img2.getDrawable() != null) {
Thread SaveImage = new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap;
File image;
boolean success;
BitmapDrawable drawable = (BitmapDrawable) img2
.getDrawable();
bitmap = drawable.getBitmap();
new File(G.DIR_IMAGE + G.date + "/" + G.id)
.mkdirs();
image = new File("آدرس محلی که میخوای ذخیره کنی", "نام عکس");
success = false;
// Encode the file as a PNG image.
FileOutputStream outStream;
try {
outStream = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.PNG, 100,
outStream);
/* 100 to keep full quality of the image */
outStream.flush();
outStream.close();
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
Toast.makeText(G.context,
"تصویر ذخیره شد",
Toast.LENGTH_LONG).show();
}
});
} else {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
Toast.makeText(G.context,
"مشکل در ذخیره سازی",
Toast.LENGTH_LONG).show();
}
});
}
}
});
SaveImage.start();
} else {
Toast.makeText(G.context, "ابتدا یک عکس انتخاب کنید!",
Toast.LENGTH_LONG).show();
}
}
});
btnBrowse = (Button) findViewById(R.id.bnBrowse);
btnBrowse.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent pickPhoto = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView imageView = (ImageView) findViewById(R.id.img);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
imageView.setMaxHeight(500);
imageView.setMaxWidth(500);
}
}
}
سلام
داخل این کد پست بالا در خطی که علامت گذشتم موقع انتخاب عکس از گالری در بعضی مواقع نرم افزار کرش میکنه !
دلیلش چیه چرا بعضی مواقع کرش میکنه ؟
ممنون
@Override
protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
&&null!= data){
Uri selectedImage = data.getData();
String[] filePathColumn ={MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn,null,null,null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView imageView =(ImageView) findViewById(R.id.img);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); <<<<<<< کرش
imageView.setMaxHeight(500);
imageView.setMaxWidth(500);
}
}
به این نتیجه رسیدم که دلیلش بزرگ بودن حجم و سایز عکسه ... ولی راه حل ؟
این آموزش میتونه کمکتون کنه.
از این متد استفاده کنید. روش استفاده هم اینه که uri تصویر رو همراه با سایزی که میخوای تصویر انتخاب شده از گالری بزرگتر از اون نباشه رو بهش می دید، خودش اندازه تصویر رو تغییر میده. حالا اگر تصویری که از گالری انتخاب می کنی بزرگتر از عددی باشه که به این متد ارسال کردی خودش تصویر رو کوچیک می کنه و دیگه برنامه کرش نمی کنه.
public static Bitmap decodeUri(Context c, Uri uri, final int requiredSize) throws FileNotFoundException {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o);
int width_tmp = o.outWidth
, height_tmp = o.outHeight;
int scale = 1;
while(true) {
if(width_tmp / 2 < requiredSize || height_tmp / 2 < requiredSize){
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, o2);
}
من متد اینجوری صدا زدم :
decodeUri(MainActivity.this,selectedImage,1000);
و مقدار BitmapFactory.Options به صورت فیلد تعریف کردم که بشه برگردوند حالا شما برا گرفتن مقدار برگشتی و set کرد روی imageView چیکار میکنی ؟ اون خط کد برا گرفتن این مقدار چجوری باید نوشت ؟
ممنون
نه نیازی به تبدیل کردن به فیلد نیست.
خیلی راحت تو متد onActivityResult مقدار uri رو میدم به متد decodeUri و متد بهم یه Bitmap بر میگردونه منم اون Bitmap رو برای ImageView ست می کنم:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
selectedImage = data.getData();
try {
Bitmap image = decodeUri(this, selectedImage, 1200);
imageView.setImageBitmap(image);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
اینم کدی که تا اینجا بدست اومد
من درست نمی تونم نحوه عملکرد این کد متوجه بشم بازم همون کرش وجود داره
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
int RESULT_LOAD_IMAGE = 1 ;
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
getWindow().setLayout(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
Uri selectedImage = data.getData();
try {
Bitmap image = decodeUri(this, selectedImage, 1200);
imgUser.setImageBitmap(image);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
public static Bitmap decodeUri(Context c, Uri uri, final int requiredSize) throws FileNotFoundException {
BitmapFactory.Options options1 = new BitmapFactory.Options();
options1.inJustDecodeBounds = true;
BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, options1);
int width_tmp = options1.outWidth, height_tmp = options1.outHeight;
int scale = 1;
while(true) {
if(width_tmp / 2 < requiredSize || height_tmp / 2 < requiredSize){
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scale;
return BitmapFactory.decodeStream(c.getContentResolver().openInputStream(uri), null, options);
}
کد های دیگه ای رو هم تست کردم همه همین مشکل داشتند !!!
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .