如何从图库和相机中裁剪图像

Posted

技术标签:

【中文标题】如何从图库和相机中裁剪图像【英文标题】:How to crop images from gallery and camera 【发布时间】:2018-02-06 09:05:46 【问题描述】:

我知道网上有很多不同的教程教你如何实现裁剪,但我无法将裁剪功能应用于我的项目。我正在构建一个 OCR 应用程序,我使用 onActivityresult 来执行我的 OCR。我不知道如何将裁剪功能添加到我的代码中。请帮忙。

这是我的画廊按钮。

  findViewById(R.id.b1).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, REQUEST_GALLERY);
            
        );

这是我的相机按钮。

findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                String filename = System.currentTimeMillis() + ".jpg";

                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, filename);
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
                imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                Intent intent = new Intent();
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, REQUEST_CAMERA);
            
        );

这是我的 onActivityresult

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        switch (requestCode) 
            case REQUEST_GALLERY:
                if (resultCode == RESULT_OK) 
                    inspect(data.getData());
                
                break;
            case REQUEST_CAMERA:
                if (resultCode == RESULT_OK) 
                    if (imageUri != null) 
                        inspect(imageUri);
                    
                
                break;
            default:
                super.onActivityResult(requestCode, resultCode, data);
                break;
        
    

因为我将我的图像传递给“检查”类,我如何在将它们传递给检查之前实现裁剪?

【问题讨论】:

【参考方案1】:

你不应该在活动结果上做太多工作,你可以启动一个新线程来做复杂的事情,使用 rxjava 很容易做到这一点。在你的情况下这样做:

Observable.just(imgUri)
          .subscribeOn(Schedulers.io())
          .map(uri -> MediaStore.Images.Media.getBitmap(getContentResolver(), uri))
          .map(bitmap -> getCroppedImgAndReturnItsUri(bitmap))
          .observeOn(androidSchedulers.mainThread())
          .subscribe(uri -> inspect(uri);, throwable -> )

别忘了在你的活动停止处丢弃这个一次性用品。

【讨论】:

谢谢。我对此很陌生,我应该在哪里粘贴这段代码?以及“不要忘记在活动停止时丢弃此一次性用品”是什么意思? 您可以在获取“case REQUEST_CAMERA:”之类的图像 uri 时粘贴此代码。你可以在这里找到 rxjava 文档:github.com/ReactiveX/RxJava。 “处置这个一次性”就像你应该在退出活动时取消回调。 我很抱歉,但还有其他更简单的方法可以实现吗?我很困惑

以上是关于如何从图库和相机中裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

刚从相机拍摄并通过从图库中挑选显示的Android裁剪图像

Android:在捕获或从图库中挑选后裁剪图像

从相机和图库上传在所有版本中都无法正常工作

android从图库中裁剪图像nullpointerexception

从图库中挑选或从相机捕获的高质量图像

如何从 recyclerview 裁剪图像并使用新裁剪的图像更新 recyclerview?