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

انتخاب عکس و ایجاد یک نوشته روی عکس و ذخیره اون عکس

مدیریت گفتگو
parsarezaei 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام همون طور که از تیتر سوال مشخصه میخام یک عکس انتخاب کنم از گالری یا از داخل خود برنامه و بعد روی عکس بنویسم و سپس بتونم عکس رو با اون نوشته در گالری ذخیره کنم . اگه ممکن راهنمایی کنید

نظرات

hosseinAmini 11 سال پیش
بعد از اینکه روی عکس نوشتید برای ذخیره، از imageView یه اسکرین شات بگیرید

پاسخ‌ها 9

hosseinAmini 11 سال پیش

با این کد میشه از view مورد نظر اسکرین شات گرفت. اون دوتا 700 هم سایز اسکرین شات گرفته شدس

yourView.setDrawingCacheEnabled(true);
Bitmap resizedBitmap = Bitmap.createScaledBitmap(yourView.getDrawingCache(), 700,
700, true);

نظرات

parsarezaei 11 سال پیش
انوقت این اسکیرین شات کجا ذخیره میشه؟
hosseinAmini 11 سال پیش
ذخیره نمیشه.همونطور که معلومه یه bitmap میده(resizedBitmap) که می تونی این bitmap رو ذخیره کنی.
Ghost 11 سال پیش
سلام . وقتی از ویو مورد نظرم عکس گرفتم چجوری توی sdkard ذخیره کنم ؟
سجاد زهره ای 11 سال پیش

سلام به کمک این کد گالری رو باز میکنی

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;

 

 

 

 

نظرات

parsarezaei 11 سال پیش
مرسی اما کدتون از متقیرر UI ایراد میگیره همچنین از و SELECT_PICTURE_CAMERAو NameImage
parsarezaei 11 سال پیش
و چه جوری دخیره کنم؟
سجاد زهره ای 11 سال پیش
اها شرمنده شما نیاز به ui ندارین!و nameimage یه متغیر هست که اسم عکسو داخل خودش ذخیره میکنه!خب اول باید تعریفش کنید.و همچنین متغیر SELECT_PICTURE_CAMERA الان من نحوه تعریفشو اضافه میکنم
parsarezaei 11 سال پیش
یه سوال دیگه من میخام یک عکس از گالری انتخاب کنم و اونو توی sdcard ذخیره کنم و تو دیتابیس هم ذخیره کنم چه جوری این کار رو باید بکنم؟
سجاد زهره ای 11 سال پیش
اینم که میدونید که متغیر imgImage در اصل همون ImageView هست که میخوام عکس داخلش نماش بدم
parsarezaei 11 سال پیش
بله اگه ممکنه یک پروژه یا راهنمایی کنید که چه جوری میتونم عکس و تو دیتابیس ذخیره کنم تو سرویس گشتم اما هیچی نفهمیدم اینقدر گنگ بود
سجاد زهره ای 11 سال پیش
نگاه دوست عزیز انتخاب از گالری هم به همین شکله!الان انتخاب از گالری هم اضافه میکنم
parsarezaei 11 سال پیش

خودم با این کد میتونم از گالری عکس انتخاب کنم ونمایش بدم اما نمیدونم چه جوری تو دیتابیس ذخیره کنم؟

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

        }
    }
}
 

نظرات

سجاد زهره ای 11 سال پیش
شما یه button هم واسه ذخیره بسازین و اینجا متد onclick رو فرخوانی کنید تا من واستون جایگزین کنم
parsarezaei 11 سال پیش
همون button btnbrows خوبه بقیشو نفهمیدم اگه بتونین جایگزین کنین خیلی خیلی ممنون میشم :)
سجاد زهره ای 11 سال پیش

 

اینو ببین

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

}
}
}

 

نظرات

parsarezaei 11 سال پیش
یه سری جاها به کلاس G اشاره شده اگه ممکنه اون کلاس رو هم بزارید چون ارور میگیره
parsarezaei 11 سال پیش
درست شد اما یه مشکل دیگه که دارم اینه که چه جوری باید عکس رو از sdcrd بخونم و نمایش بدم؟
doost_fu 11 سال پیش

سلام
داخل این کد پست بالا در خطی که علامت گذشتم موقع انتخاب عکس از گالری در بعضی مواقع نرم افزار کرش میکنه !
دلیلش چیه چرا بعضی مواقع کرش میکنه ؟
ممنون

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

}
}

به این نتیجه رسیدم که دلیلش بزرگ بودن حجم و سایز عکسه ...  ولی راه حل ؟

نظرات

hosseinAmini 11 سال پیش

این آموزش میتونه کمکتون کنه.
از این متد استفاده کنید. روش استفاده هم اینه که 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);
}

نظرات

doost_fu 11 سال پیش
ممنون ، اون لینک اول که برا کراپ کردن بود من نیازی به کراپ ندارم و این کدی هم که گذاشتید با مقدار uri صدا زدم و مقدار برگشتی گرفتم و روی imgeView ست کردم ولی همون مشکل پابرجا بود . راهی وجود نداره که همون عکس انتخابی با هر سایزی بدون تغیییر وارد برنامه بشه ؟ اخه نمی خوام کیفیت عکس هم کم بشه ! با تشکر .
hosseinAmini 11 سال پیش
آخ ببخشید uri باید ارسال می کردید اصلا یادم نبود :) خواهش می کنم. والا منم این مشکل رو داشتم بعد از کلی جست و جو تو stackoverflow یه نفر این روش رو پیشنهاد داده بود و مشکلم کامل حل شد. (روش دیگه رو نمی دونم هست یا نه). شما سایز رو 1000 بده و برای context اکتیویتی ای رو که توش هستی رو بده، ببین مشکلت حل میشه..
doost_fu 11 سال پیش

من متد اینجوری صدا زدم :

 decodeUri(MainActivity.this,selectedImage,1000);

و مقدار BitmapFactory.Options به صورت فیلد تعریف کردم که بشه برگردوند حالا شما برا گرفتن مقدار برگشتی و set کرد روی imageView چیکار میکنی ؟ اون خط کد برا گرفتن این مقدار چجوری باید نوشت ؟
ممنون

نظرات

hosseinAmini 11 سال پیش

نه نیازی به تبدیل کردن به فیلد  نیست.
خیلی راحت تو متد 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();
}
}
}

نظرات

doost_fu 11 سال پیش
دم شما گرم ولی بازم مثل قبل روی عکسهای بزرگ مثل عکس های گرفته شده با دوربین کرش میکنه
doost_fu 11 سال پیش

اینم کدی که تا اینجا بدست اومد
من درست نمی تونم نحوه عملکرد این کد متوجه بشم بازم همون کرش وجود داره

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

کد های دیگه ای رو هم تست کردم همه همین مشکل داشتند !!!

نظرات

hosseinAmini 11 سال پیش
خواهش میکنم. ولی دیگه نباید کرش کنه :| برا من به همین روش درست شد. مطمئنی خطا از جای دیگه نیست؟ یه عکس با دوربین بگیر بعد تو برنامت از گالری انتخابش کن ببین بازم کرش می کنه. اگه آره خطایی که میده رو بنویس ببینیم چیه.

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