Androidオリジナルカット方式を呼び出して画像を切り取り保存


文書ディレクトリ
  • 前言
  • 一、ピクチャの取得方法
  • 1.カメラ方式によるインスタント撮影
  • 2.アルバム方式で写真
  • を選択
  • 二、選択した写真を取得して切り出す
  • 1.カメラが撮影した写真
  • を取得
  • 2.選択した写真
  • を取得
  • 3.クロップを呼び出すと
  • に戻ります.
  • 4.システムを呼び出して画像を切り取った後、
  • に戻る.
  • 5.切り取った画像を指定ファイル
  • に保存する.
  • 三、注意事項
  • まとめ
  • 前言
    Androidはオリジナルのトリミング方式を提供し、トリミング後のリソースを対応するディレクトリに出力します.主に2つの方法があります.次に、この2つの方法を見てみましょう.
    Android 10はパーティションストレージを提案しているので、ここではパーティションストレージをしばらく使用しないように、android:r e q u s t LegacyExternalStorage="true"のような構成で従来のストレージ方式を使用する、またAndroid 7.0対はアクセスロジックの必要性をUriで制限、Providerを構成してuriを作成してFileProviderを使用する必要がある.getUriForFile().
    一、画像の取得方法
    1.カメラ方式でインスタント撮影
        /**
         *        
         */
        private void getPicFromCamera() {
         
            //                 
            tempFile = new File(Environment.getExternalStorageDirectory().getPath(), System.currentTimeMillis() + ".jpg");
            //         
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //   Android7.0  ,  FileProvider  Uri
                intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                Uri contentUri = FileProvider.getUriForFile(MainActivity.this,
                        this.getPackageName() + ".fileprovider", tempFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
            } else {
             //    Uri.fromFile(file)    Uri
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
            }
            startActivityForResult(intent, CAMERA_REQUEST_CODE);
        }
    

    2.アルバム方式で写真を選ぶ
            /**
         *        
         */
        private void getPicFromAlbm() {
         
            Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
            photoPickerIntent.setType("image/*");
            startActivityForResult(photoPickerIntent, ALBUM_REQUEST_CODE);
        }
    
    

    二、選択した写真を取得して切り取る
    1.カメラで撮影した写真を取得する
    コードは次のとおりです.
    case CAMERA_REQUEST_CODE:   //       
                    if (resultCode == RESULT_OK) {
         
                        //                 Uri    
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
         
                            Uri contentUri = FileProvider.getUriForFile(MainActivity.this,
                                    this.getPackageName() + ".fileprovider", tempFile);
                            cropPhoto(contentUri);
                        } else {
         
                            cropPhoto(Uri.fromFile(tempFile));
                        }
                    }
                    break;
    

    2.選択した写真を取得
    コードは次のとおりです.
     case ALBUM_REQUEST_CODE:    //       
                    if (resultCode == RESULT_OK) {
         
                        Uri uri = intent.getData();
                        cropPhoto(uri);
                    }
                    break;
    

    3.クリップを呼び出して戻る
    コードは次のとおりです.
     case CROP_REQUEST_CODE:     //       
                    if (intent == null) {
         
                        return;
                    }
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
         
                        //          Bitmap  ,      
                        Bitmap image = bundle.getParcelable("data");
                        //   ImageView 
                        mHeader_iv.setImageBitmap(image);
                        //         、        
                        // String path = saveImage("head_output", image);
                        //  Log.d("dsadsadsa",path);
                    }
                    break;
    

    4.システムを呼び出して画像を切り取って戻る
    コードは次のとおりです.
      /**
         *     
         * * https://www.jianshu.com/p/3b92a0e30828
         */
        private void cropPhoto(Uri uri) {
         
            // 7.0          ,   “           ”
            //    ,   7.0       uri  ,   FileProvider,       
            //Uri.fromFile(file)   ,     FileProvider.getUriForFile
            //intent.putExtra("set-as-wallpaper",true);    false,    true   ,            ,          。
            // intent.putExtra("return-data", true);         bitmap
            // if (data != null && data.getParcelableExtra("data") != null) {
         
            //                mStream = new ByteArrayOutputStream();
            //                mBitmap = data.getParcelableExtra("data");
            //                mBitmap.compress(Bitmap.CompressFormat.PNG, 100, mStream);
            //                /**       */
            //                /**           */
            //                File files = creatFile(mBitmap);//    
            //                ...       ...
            //}
            Uri contentUri = Uri.fromFile(new File(getPhotoPath()));
            Intent intent = new Intent("com.android.camera.action.CROP");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
         
                //Android 7.0        Url   ,           :         :                       
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
            intent.setDataAndType(uri, "image/*");
            intent.putExtra("crop", "true");//      ,        
            intent.putExtra("scale", true);//     
            intent.putExtra("scaleUpIfNeeded", true);//    
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            ////            ,            。
            intent.putExtra("outputX", 300);//        ,          。
            intent.putExtra("outputY", 300);//   1:1800*4002:1     ,
            intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());//         
            intent.putExtra("return-data", true);//          Bitmap 
            intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);//      
            startActivityForResult(intent, CROP_REQUEST_CODE);
        }
    

    5.切り取った画像を指定ファイルに保存する
    ###切り取り時に出力パスが設定されていない場合、Bitmapに戻るとBitmapを指定ファイルに出力できます.
    コードは次のとおりです.
       public String saveImage(String name, Bitmap bmp) {
         
            File appDir = new File(    );
            if (!appDir.exists()) {
         
                appDir.mkdir();
            }
            String fileName = name + ".jpg";
            File file = new File(appDir, fileName);
            try {
         
                FileOutputStream fos = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.flush();
                fos.close();
                return file.getAbsolutePath();
            } catch (IOException e) {
         
                Log.d("dsadsadsa", e.getLocalizedMessage());
                e.printStackTrace();
            }
            return null;
        }
    

    三、注意事項
    次の点に注意してください.
    outputXとoutputYは0にできず、手が0にサポートされていない場合があります.outputXとoutputYはあまり大きく設定できません.私のdemoでは300しか設定されていませんが、一部の携帯電話では600を設定するとシステム層にOOM現象が発生します.return-data属性値はtrueのみで、データは返されません.URIオブジェクトの取得には以下のコードが必要です
    Uri.fromFile(new File(crop_path))
    

    書くなら
    Uri.parse(crop_path)
    

    データが返されない場合があります.
    まとめ
    以上、Androidシステムのトリミングについてですが、エラーがあれば、ご指摘ください!!!優秀な記事を参照:
  • https://www.jianshu.com/p/3b92a0e30828
  • https://www.jianshu.com/p/c6271f5dad46
  • https://links.jianshu.com/go?to=https%3A%2F%2Fsegmentfault.com%2Fq%2F1010000005070720%2Fa-1020000005071373