让用户裁剪图像图像、用户

2023-09-12 22:51:10 作者:不期而遇

我有搞清楚如何让用户裁剪图片很难。 我想给带装点阵位图变量设置为墙纸之前,裁剪图片。但我不这样做......这就是我试过了。

I am having a hard time in figuring out how to let the user crop the picture. I would like to give bitmap variable with loaded bitmap to crop the picture before setting it as wallpaper. But I'm failing to do so... Here is that i tried.

第一个版本。 =按预期工作,但传回的图像是较差的分辨率。改变输出更高的价值并没有帮助。正如我在一些后看到它是不建议使用的相机,因为不是所有设备都支持这一点。

First version. = Works as expected BUT the returned image is in poor resolution. Changing the output to higher value doesn't help. As I saw in some post it is not recommended to use camera as not all devices support this.

Intent intent = new Intent("com.android.camera.action.CROP");  
String path = Images.Media.insertImage(context.getContentResolver(), loaded,null, null);
Uri uri = Uri.parse(path);              
intent.setData(uri);  
intent.putExtra("crop", "true");  
intent.putExtra("aspectX", 1);  
intent.putExtra("aspectY", 1);  
intent.putExtra("outputX", 300);  
intent.putExtra("outputY", 300);  
intent.putExtra("noFaceDetection", true);  
intent.putExtra("return-data", true);                                  
startActivityForResult(intent, 2);

二。加载了图像选择器,和作物之后。我怎样才能configurate这直接在我的形象载入作物?就像在版本1

Second. Load up image chooser, and crop afterwards. How can I configurate this to load crop directly on my image? Just like in version 1

Intent photoPickerIntent = new Intent(MediaStore.ACTION_PICK);
photoPickerIntent.setData(uri);
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, 2);

和onActivity结果

And onActivity result

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) { return; }
    if(requestCode == 2) {
        Bundle extras = data.getExtras();  
        if(extras != null ) {  
            Bitmap photo = extras.getParcelable("data");  
            loaded = photo;
        }
        WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());

        try {
            myWallpaperManager.setBitmap(loaded);
        } catch (IOException e) {}
    }
}

我不知道whever这些都让这个做了正确的方法,但我希望有人可以点我在正确的方向。其中,为什么,以及如何使用。

I do not know whever these are the correct methods to make this done, but I hope somebody could point me in the right direction. Which, why, and how to use.

更新:我仍然在等待有人指出,如何正确地做到这一点,下面的答案是工作,但在返回较差的分辨率的图像,所以它们不是一个选项,使用

Update: I am still waiting for someone to point out how to do it correctly, answers below are working but returning images in poor resolution, so they are not an option to use

推荐答案

好吧亲爱的我在这里把裁切图像的我的整个code在Android系统。 这个全局变量。

Ok Dear Here I put my Whole code of Crop Image In Android. This the Global variable.

    //This For Image Crop
        /**
         *  Uri for set image crop option .
         */
        private Uri mImageCaptureUri;
        /**
         *  int for set key and get key from result activity . 
         */
        public final int CROP_FROM_CAMERA = 0;

/**
     * Bitmap for apply Crop Operation Result.
     */
    private Bitmap _tempOpration;

    //This is Crop Method.

/**
     * Method for apply Crop .
     * @param filePath -  String path of file .
     */
    private void doCrop(String filePath){
        try{
            //New Flow
            mImageCaptureUri = Uri.fromFile(new File(filePath));

            final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setType("image/*");
            List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );

            int size = list.size();
            if (size == 0) 
            {           
                Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();
                return;
            }
            else 
            {
                intent.setData(mImageCaptureUri);
                intent.putExtra("outputX", 300);
                intent.putExtra("outputY", 300);
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("scale", true);
                intent.putExtra("return-data", true);

                if (size == 1) 
                {
                    Intent i = new Intent(intent);
                    ResolveInfo res = list.get(0);
                    i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                    startActivityForResult(i, CROP_FROM_CAMERA);
                }

                else
                {
                    for (ResolveInfo res : list) 
                    {
                        final CropOption co = new CropOption();
                        co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                        co.icon = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                        co.appIntent= new Intent(intent);
                        co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                        cropOptions.add(co);
                    }

                    CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setTitle("Choose Crop App");
                    builder.setAdapter( adapter, new DialogInterface.OnClickListener()
                    {
                        public void onClick( DialogInterface dialog, int item )
                        {
                            startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
                        }
                    });

                    builder.setOnCancelListener( new DialogInterface.OnCancelListener() 
                    {
                        public void onCancel( DialogInterface dialog ) 
                        {
                            if (mImageCaptureUri != null ) 
                            {
                                getContentResolver().delete(mImageCaptureUri, null, null );
                                mImageCaptureUri = null;
                            }
                        }
                    } );
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }
        }
        catch (Exception ex) 
        {
            genHelper.showErrorLog("Error in Crop Function-->"+ex.toString());
        }
    }

这是另一个类巫婆使用的应用程序中发现作物活动的意图。

CropOption类。

public class CropOption 
{
    public CharSequence title;
    public Drawable icon;
    public Intent appIntent;
}

这是使用对于显示列表中。

this is use For Display List.

CropOptionAdapter

public class CropOptionAdapter extends ArrayAdapter<CropOption> 
{
    private ArrayList<CropOption> mOptions;
    private LayoutInflater mInflater;

    public CropOptionAdapter(Context context, ArrayList<CropOption> options) 
    {
        super(context, R.layout.crop_selector, options);

        mOptions    = options;

        mInflater   = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup group)
    {
        if (convertView == null)
            convertView = mInflater.inflate(R.layout.crop_selector, null);

        CropOption item = mOptions.get(position);

        if (item != null) {
            ((ImageView) convertView.findViewById(R.id.iv_icon)).setImageDrawable(item.icon);
            ((TextView) convertView.findViewById(R.id.tv_name)).setText(item.title);

            return convertView;
        }

        return null;
    }
}

布局文件对于CropOptionAdapter

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>
</LinearLayout>

这是resultActivity.witch给作物的形象。

/**
     * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) return;
        switch (requestCode)
        {
        case CROP_FROM_CAMERA:
            if (data == null) 
            {
                genHelper.showToast("No Crop Activity in This");
                return;
            }
            final Bundle extras = data.getExtras();
            if (extras != null) 
            {
                try 
                {

                    _tempOpration=extras.getParcelable("data");
                    imageLayout.setImageBitmap(_tempOpration);
                    _tempOpration=null;

                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
            break;
        }

    }

//做这类它在我住的应用程序的工作。

//Do This Type It's work on my live app.

genHelper.showToast(没有作物活动中的);

我是一般类,以帮助显示敬酒消息和错误日志。

is my general Class to help display toast message and Error Log.

最妙的运气。