【问题标题】:How to convert URI to bitmap? [duplicate]如何将 URI 转换为位图? [复制]
【发布时间】:2018-07-21 14:28:48
【问题描述】:

我正在制作一个图像过滤器应用程序,在应用过滤器之前,我会将图像裁剪为正方形,我可以使用 Soundcloud 库来裁剪图像,如下所示:-

private void beginCrop(String sources) {
    img_name = "cropped"+System.currentTimeMillis();
    Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped"+System.currentTimeMillis()));
    Uri source = Uri.parse("file://"+sources);
    Crop.of(source, destination).withAspect(200,200).start(this);
}

private void handleCrop(int resultCode, Intent result) {
    if (resultCode == RESULT_OK) {
        Toast.makeText(this,Crop.getOutput(result).toString(), Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(AlbumActivity.this,FilterImageActivity
                .class);
        intent.putExtra("output_image",Crop.getOutput(result).toString());
        startActivity(intent);
    } else if (resultCode == Crop.RESULT_ERROR) {
        Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show();
    }
}}

在下一个活动上是 FilterImageActivity.java:-

     @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_filter_image);

        String uri = getIntent().getStringExtra("output_image");
        setImageDir(uri);
}

而函数 setImageDir():-

 private void setImageDir(String uri)
    {
        Bitmap bitmap = convetBitmap(uri);

        // clear bitmap memory
       /* originalImage.recycle();
        finalImage.recycle();
        finalImage.recycle();*/

        originalImage = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
        finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true);
        imagePreview.setImageBitmap(originalImage);
        bitmap.recycle();

        // render selected image thumbnails
        filtersListFragment.prepareThumbnail(originalImage);
    }

还有convertBitmap()函数:-

 private Bitmap convetBitmap(final String uri)
   {
       final Bitmap[] bitmap = {null};
       Thread task = new Thread()
       {
           @Override
           public void run()
           {
               try {
                   bitmap[0] =   Glide.with(getApplicationContext()).asBitmap().load(Uri.parse(uri)).into(100,100).get();
               } catch (InterruptedException | ExecutionException e) {
                   e.printStackTrace();
               }
           }
       };

       task.start();


   return bitmap[0];

}

图像被裁剪并保存到目录例如

file:///data/user/0/com.dev.pigeon/cache/cropped1518332591373

但它给出了一个错误

 Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.Bitmap.copy(android.graphics.Bitmap$Config, boolean)' on a null object reference

也许URI没有转换成位图请任何解决方案???

【问题讨论】:

    标签: java android bitmap nullpointerexception crop


    【解决方案1】:

    要将 URI 转换为位图,您可以执行以下操作。

    try {
        if(  Uri.parse(paths)!=null   ){  
         Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
            }
       }
       catch (Exception e) {
                //handle exception
            }
    

    当您获取文件表单文件选择器或相机意图时,您可以这样做。

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK)
        {
            Uri imageUri = data.getData();
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
        }
    }
    

    【讨论】:

    • 它给出了这个错误:- java.io.FileNotFoundException:没有内容提供者:/storage/emulated/0/DCIM/Retrica/IMG_20180208_195519863.jpg
    • 文件路径应该是这样的:file:///test/sdcard/filename.jpg
    • 谢谢,你拯救了我的一天!!!
    • 什么是 c.getContentResolver()
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2017-01-30
    相关资源
    最近更新 更多