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

آموزش گرفتن و برش عکس با دوربین گوشی و نمایش آن در قاب + سورس

SaLaH KuRD  8 سال پیش  5 سال پیش
+43 0

سلام توی این پست میخوایم نحوه گرفتن عکس با دوربین گوشی و سپس برش اون رو یاد بگیریم و سپس اون رو توی یک عکس که دورش قاب داره نشون بدیم ، پس شروع می کنیم.

ببخشید اگه کدها رو همینطوری قرار دادم و زیاد توضیح ندادم چون توضیح دادن خط به خط کد ها زمان زیادی میخوام سورس پروژه رو هم قرار دادم که توش توضیح بیشتری داده شده.

اگر مطلب مفیده و مورد استفاده واقع شده از دکمه استفاده کنید !

اول از همه یه پروژه جدید توی Eclipse درست میکنیم و اسمش رو به دلخواه قرار میدیم.

بعد توی پوشه layout فایل main.xml رو باز میکنیم و یه Textview و Button و ImageView قرار میدیم.

کد مربوط به TextView :

 <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Capture a picture to crop!"
android:layout_margin="3dp"
android:textStyle="bold" />

کد مربوط به Button :

 <Button
android:id="@+id/capture_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Launch Camera" />

کد مربوط به ImageView :

 <ImageView
android:id="@+id/picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp" android:background="@drawable/pic_border"/>

حالا میخوایم برای عکسی که قراره توی آخر کار نشون بدیم یه قاب بسازیم پس توی پوشه res یه پوشه به اسم drawable میسازیم و یه فایل به اسم pic_border.xml توی اون ایجاد میکنیم شبیه عکس زیر :

فایل pic_border.xml رو باز میکنیم و کد های ریز رو داخلش قرار میدیم ( بعدا رنگ و جزئییات رو می تونید مطابق سلیقه خودتون تغییر بدید)

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true">
<gradient
android:startColor="#99ffffff"
android:endColor="#99ffffff"
android:centerColor="#00000000"
android:angle="90" />
<padding android:left="10dp" android:top="10dp"
android:right="10dp" android:bottom="10dp" />
<corners android:radius="5dp" />
<stroke
android:width="2dp"
android:color="#ccffffff" />
</shape>

خوب تا اینجا باید فایل main.xml ما شبیه عکس زیر باشه :

خوب فایل xml آماده شده و مونده کدنویسی ، فایل Activityتون رو باز کنید و کلاستون رو به این شکل تغییر بدید :

 public class ShootAndCropActivity extends Activity implements OnClickListener {

فایل Oncreate رو هم اینطوری بسازید :

 /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//retrieve a reference to the UI button
Button captureBtn = (Button) findViewById(R.id.capture_btn);
//handle button clicks
captureBtn.setOnClickListener(this);
}

حالا زیر Oncreate میخوایم بگیم که اگه روی Button کلیک شد دوربین رو باز کنه برای همین این کد ها رو قرار بدید :

  /**
* Click method to handle user pressing button to launch camera
*/
@Override
public void onClick(View v) {
if (v.getId() == R.id.capture_btn) {
try {
//use standard intent to capture an image
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//we will handle the returned data in onActivityResult
startActivityForResult(captureIntent, CAMERA_CAPTURE);
}
catch (ActivityNotFoundException anfe) {
//display an error message
String errorMessage = "Whoops - your device doesn't support capturing images!";
Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
toast.show();
}
}
}

و همچنین توی کدهای بالا از try و catch استفاده کردیم که اگه موبایل دوربین نداشت force close نده و بگه که متاسفانه گوشی شما قابلیت عکسبرداری ندارد که میتونید پیامش رو تغییر بدید.
خوب الان باید کدهای مربوط به قسمت Crop و ذخیره کردن عکس رو قرار بدیم :

   /**
* Handle user returning from both capturing and cropping the image
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
//user is returning from capturing an image using the camera
if (requestCode == CAMERA_CAPTURE) {
//get the Uri for the captured image
picUri = data.getData();
//carry out the crop operation
performCrop();
}
//user is returning from cropping the image
else if (requestCode == PIC_CROP) {
//get the returned data
Bundle extras = data.getExtras();
//get the cropped bitmap
Bitmap thePic = extras.getParcelable("data");
//retrieve a reference to the ImageView
ImageView picView = (ImageView) findViewById(R.id.picture);
//display the returned cropped image
picView.setImageBitmap(thePic);
}
}
}


/**
* Helper method to carry out crop operation
*/
private void performCrop() {
//take care of exceptions
try {
//call the standard crop action intent (the user device may not support it)
Intent cropIntent = new Intent("com.android.camera.action.CROP");
//indicate image type and Uri
cropIntent.setDataAndType(picUri, "image/*");
//set crop properties
cropIntent.putExtra("crop", "true");
//indicate aspect of desired crop
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
//indicate output X and Y
cropIntent.putExtra("outputX", 256);
cropIntent.putExtra("outputY", 256);
//retrieve data on return
cropIntent.putExtra("return-data", true);
//start the activity - we handle returning in onActivityResult
startActivityForResult(cropIntent, PIC_CROP);
}
//respond to users whose devices do not support the crop action
catch (ActivityNotFoundException anfe) {
//display an error message
String errorMessage = "Whoops - your device doesn't support the crop action!";
Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
toast.show();
}
}

کدهای ما آماده شدند فقط یادتون نره که این فیلدها رو هم زیر کلاس ShootAndCropActivity اضافه کنید :

 //keep track of camera capture intent
final int CAMERA_CAPTURE = 1;
//keep track of cropping intent
final int PIC_CROP = 2;
//captured picture uri
private Uri picUri;

تبریک میگم برنامه عکسبرداری شما آماده است خسته نباشید :)

سورس پروژه : http://tiktm.com/CropImage.zip

0 0
با عرض سلام من سورس شما رو دانلود کردم قسمت اولش که دوربین رو فعال میکنه، کار میکنه ولی قسمت دومش که عکس رو باید تو یه قاب قابل Resize نمایش بده رو نتونستم ببینم (8 سال پیش)
0 0
خوب بعد از اینکه دوربین گوشی بالا اومد باید یه عکس بگیرید و بعد یه صفحه باز میشه که ازتون میخواد عکس رو به دلخواه برش بدید و بعد از برش عکس می تونید اون رو توی قاب ببینید. (8 سال پیش)
0 0
(8 سال پیش)
0 0
آن قسمتی که بعد از گرفتن عکس قرار است بیاید تا ما عکس را برش بدهیم نمیاید. فقط عکس میگیرد حتی در گالری هم ذخیره نمیگردد . ما باید کدهای شما را تغییر دهیم . اشتباه است عین این کد استفاده کنیم. زیرا جواب نمیدهد. (7 سال پیش)
0 0
سلام دوست عزیز کدهای این پروژه در محیط های Eclipse و Android studio کاملا تست شده و بدون مشکل اجرا میشود ، جهت اطمینان از صحت کارکرد کد میتوانید سورس پروژه را در آخر مطلب دانلود و استفاده نمایید موفق باشید. (7 سال پیش)
+1 0
کیفیت تصویر موقع نمایش کم میشه (7 سال پیش)
0 0
برای من روی امولاتور کار نکرد ولی روی گوشی کار میکنه . البته داخل خود کدها کامنت کرده که ممکنه دستگاه کاربر اونو ساپورت نکنه . در قسمت تابع performCrop : call the standard crop action intent (the user device may not support it) لینک (5 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
SaeiD-as  8 سال پیش
0 0

مرسی رفیق از این آموزشت، من برای برنامم هنگامی که روی Button کلیک شد یک دیالوگ قرار دادم که عکس از گالری خوانده بشه یا از دوربین، می خوام زمانی که عکس از داخل گالری هم انتخاب شد بتونم اونو برش بدم اما نمیدونم داخل متد onActivityResult  تابع performCrop رو چطوری تعریف کنم، ممنون میشم راهنمایی کنید. . .

کدهای دیالوگ رو در زیر قرار دادم :

 private void selectImage() {
        final CharSequence[] options = { "Take Photo", "Choose from Gallery", "Cancel" };
        AlertDialog.Builder builder = new AlertDialog.Builder(G.currentActivity);
        builder.setTitle("Add Photo!");
        builder.setItems(options, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                if (options[item].equals("Take Photo"))
                {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                    startActivityForResult(intent, 1);
                } else if (options[item].equals("Choose from Gallery"))
                {
                    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(intent, 2);
                } else if (options[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }

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