2

我需要从 Drawable 目录中选择一个图像。我的代码是:

private  void CreateViewForIndex(View rootView, int index) {
    // Instantiate GPUImageView object          
    ImageView mGPUImageView = (ImageView)rootView.findViewById(R.id.image); 

    // Set an image from file inside GPUImageView object    
    File imageFile = new File("/MainActivity/res/drawable-hdpi/russia.jpeg");               
    mImageView.setImage(imageFile);

    // Apply filter
    mImageView.setFilter(returnFilterForIndex(index));
}       

其中 rootView 是视图。我需要File从以下目录中的图像创建一个新对象:/MainActivity/res/drawable-hdpi/russia.jpeg. 问题是我无法为前一个图像文件获取正确的目录,因此 jpeg 永远不会显示。

4

1 回答 1

1

您可以使用以下代码按原样从可绘制资源创建文件,而无需在该过程中涉及任何额外的编码解码。在此代码文件中保存到应用程序私有缓存中,但可以轻松修改以适应保存到任何文件。

public File createFileFromResource(int resId, String fileName)
{
    File f;
    try
    {
        f = new File(getCacheDir() + File.separator + fileName);
        InputStream is = getResources().openRawResource(resId);
        OutputStream out = new FileOutputStream(f);

        int bytesRead;
        byte[] buffer = new byte[1024];
        while((bytesRead = is.read(buffer)) > 0)
        {
            out.write(buffer, 0, bytesRead);
        }

        out.close();
        is.close();
    }
    catch (IOException ex)
    {
        f = null;
    }
    return f;
}

您可以像这样使用上述方法:

private void CreateViewForIndex(View rootView, int index) 
{
    // Instantiate GPUImageView object          
    GPUImageView mGPUImageView = GPUImageView)rootView.findViewById(R.id.image); 

    // Set an image from file inside GPUImageView object    
    File imageFile = new File(R.drawable.russia, "russia.jpeg"); 
    if (imageFile != null) 
    {           
        mImageView.setImage(imageFile);    
        // Apply filter
        mImageView.setFilter(returnFilterForIndex(index));
    }
}  

当您不再使用创建的缓存文件时,最好将其删除,以最大限度地减少您的应用程序存储使用

imageFile.delete();

或者您可以清除应用程序退出时的所有缓存文件

public void deleteInternalCacheFiles()
{
    File[] cacheFiles = getCacheDir().listFiles();
    for (File file : cacheFiles)
    {
        file.delete();
    }
}

但是,如果您只缓存少量文件和/或这些文件不占用太多内存,则可以安全地跳过该部分。

于 2015-08-19T12:47:10.843 回答