Let user crop image

前端 未结 4 729
慢半拍i
慢半拍i 2020-12-05 16:27

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 a

相关标签:
4条回答
  • 2020-12-05 17:11

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

    This is the another Class witch use for find Crop Activity Intent in Application.

    CropOption Class.

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

    Layout File For 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>
    

    This is the resultActivity.witch give the crop image.

    /**
         * @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("No Crop Activity in This");

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

    Bestof Luck.

    0 讨论(0)
  • 2020-12-05 17:11

    As mentioned in similar threads, Android does not have an official crop intent (https://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html), so I would stay away from using "com.android.camera.action.CROP".

    However, in the time since this question was originally posted, Android has added a new API in Kitkat (level 19) that allows users to summon a crop-this-image-and-set-as-wallpaper Activity. See WallpaperManager.getCropAndSetWallpaperIntent(), and this might address your original question.

    0 讨论(0)
  • 2020-12-05 17:15

    First, variables:

    final int PIC_CROP = 2;
    
    Uri imageUri;
    Bitmap thePic;
    

    Before you take a pic from your Camera or your Gallery, put your image into a Uri (imageUri) , use a method called here as "performCrop()" inside try/catch:

     private void performCrop(){
            try {
                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) {
                    intent.setData(imageUri);        
                    intent.putExtra("crop", "false");
                    intent.putExtra("aspectX", 1);
                    intent.putExtra("aspectY", 1);
                    intent.putExtra("outputX", 256);
                    intent.putExtra("outputY", 256);
                    intent.putExtra("scale", true);  
                    intent.putExtra("return-data", true);
    
                    Intent i = new Intent(intent);
                    ResolveInfo res = list.get(0);
                    i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
    
                    startActivityForResult(i, PIC_CROP);  
                } 
    
            }
            catch(ActivityNotFoundException anfe){
                String errorMessage = "Whoops - your device doesn't support the crop action!";
                Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
                toast.show();
            }
        }
    

    On method onActivityResult:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    
            if(requestCode == PIC_CROP){
    
            if (resultCode == RESULT_OK) {
                Bundle extras = intent.getExtras();
                thePic = extras.getParcelable("data");
                imageViewPhoto.setImageBitmap(thePic); //in my case, set the image on screen
    
            }else{
                //do something
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-05 17:15

    I also had the problem using the camera and ACTION_PICK that the returned image was very small despite the passed resolution being much larger. I got around this storing the resulted crop image in a temporary file

    // temporary storage location, preferably in your cache directory
    private final String tempFilePath = "somePath";
    
    // URI instantiated with your temporary storage location
    private Uri tempuri = Uri.fromFile(new File(tempFilePath));
    
    // code for startActivityForResult
    private final static int ACTIVITY_CROP_IMAGE = 1;
    

    and calling the intent like this

    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    photoPickerIntent.setType("image/*");
    photoPickerIntent.putExtra("crop", "true");
    photoPickerIntent.putExtra("aspectX", wallpaperWidth);
    photoPickerIntent.putExtra("aspectY", wallpaperHeight);
    photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempuri);
    photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    startActivityForResult(photoPickerIntent, ACTIVITY_CROP_IMAGE);
    

    and then in onActivityResult

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        if (resultCode != RESULT_OK) 
            return;
    
        if(requestCode == ACTIVITY_CROP_IMAGE) 
        {
            try 
            {
                Bitmap bmp = BitmapFactory.decodeFile(tempFilePath);
                if(bmp != null)
                {
                    WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
                    myWallpaperManager.setBitmap(bmp);
                }
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
            finally
            {
                if(tempFilePath != null)
                {
                    File tempFile = new File(tempFilePath);
                    if(tempFile.exists())
                    {
                        tempFile.delete();
                    }
                }
            }
        }
    }
    

    I constructed the above code from the top of my head and didn't actually compile any of it. But the basics are correct and you should get the hang ;-)

    0 讨论(0)
提交回复
热议问题