如何将uri图像转换为canvas ondraw方法

时间:2011-09-12 15:13:10

标签: java android bitmap uri

我正在从画廊搜索图像并显示。现在我想在onDraw(Canvas canvas)中显示图像。我该怎么做。请帮助我。 提前致谢

selectedImageUri = data.getData();
                        selectedImagePath = getPath(selectedImageUri);
                        Toast.makeText(getBaseContext(),"selected"+selectedImagePath,Toast.LENGTH_LONG).show();
                        System.out.println("Image Path : " + selectedImagePath);
                        img.setImageURI(selectedImageUri);

这里uri selectedImageUri;

我的OnDraw(canvas Canvas)代码:

Bitmap myBitmap1 = BitmapFactory.decodeResource(getResources(),selectedImageUri);

我的错误消息

  

BitmapFactory类型中的方法decodeResource(Resources,int)不适用于参数(Resources,Uri)

1 个答案:

答案 0 :(得分:1)

您从选择器返回的路径是Uri,并且您尝试将其作为资源ID加载,这是一个int。从getData()返回的路径是直接指向SD卡上文件的文件路径或MediaStore Uri。如果应用程序将文件保存到磁盘并且未使用任何MediaStore api方法将其插入MediaStore数据库,则会获得文件路径。否则你得到一个MediaStore Uri。出于这个原因,我使用一个包装器方法来确定它是什么并返回实际路径:

public static String getRealPathFromURI(Activity activity, Uri contentUri) {    


    String realPath = null;

    // Check for valid file path
    File f = new File(contentUri.getPath());
    if(f.exists())
        realPath = contentUri.getPath();
    // Check for valid MediaStore path
    else
    {           
        String[] proj = { MediaStore.Images.Media.DATA };
        Cursor cursor = activity.managedQuery(contentUri, proj, null, null, null);
        if(cursor != null)
        {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            realPath = cursor.getString(column_index);
            cursor.close();
        }
    }
    return realPath;
}

有了这个,我将它作为来自BitmapFactory的流加载:

注意这里省略了很多代码,所以你可能会遗漏一些东西,但这应该会给你一般的方法

    FileInputStream in = null;
    BufferedInputStream buffer = null;
    Bitmap image = null;

    try
    {
        in = new FileInputStream(path);
        buffer = new BufferedInputStream(in);
        image = BitmapFactory.decodeStream(buffer);
    }
    catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally
    {
        try
        {
            if(in != null)
                in.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try
        {
            if(buffer != null)
                buffer.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}