【问题标题】:Reading an image file from local storage on mono for android从本地存储读取图像文件单声道为android
【发布时间】:2012-04-21 18:50:24
【问题描述】:

在单声道中,我有一个应用程序可以将图像保存到本地存储以进行缓存。当应用启动时,它会先尝试从缓存中加载图像,然后再尝试从 Web 加载它们。

我目前很难找到一种从本地存储读取和加载它们的好方法。

我目前正在使用与此等效的东西:

        List<byte> byteList = new List<byte>();
        using (System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(context.OpenFileInput("filename.jpg")))
        {
            while (binaryReader.BaseStream.IsDataAvailable())
            {
                byteList.Add(binaryReader.ReadByte());
            }
        }
        return byteList.toArray();

OpenFileInput() 返回一个不给我长度的流,所以我必须一次读取一个字节。它也无法寻找。这似乎导致图像的加载速度比它们加载的速度慢得多。相比之下,从 Resrouce.Drawable 加载图像几乎是瞬间完成的,但在我的方法中,加载 8kb 文件时会有一个非常明显的暂停,可能是 300 毫秒。这似乎是一项非常明显的任务,但我尝试了许多解决方案并搜索了很多建议但无济于事。

我还注意到,当不在 UI 线程上运行时,这段代码似乎会因 EndOfStream 异常而崩溃。

任何帮助将不胜感激

【问题讨论】:

    标签: c# android xamarin.android


    【解决方案1】:

    您打算用List&lt;byte&gt; 做什么?您想“从缓存中加载图像”,但您没有指定要将它们加载到什么位置

    如果你想将它们加载到Android.Graphics.Bitmap,你可以使用BitmapFactory.DecodeStream(Stream)

    Bitmap bitmap = BitmapFactory.DecodeStream(context.OpenFileInput("filename.jpg"));
    

    这将删除List&lt;byte&gt; 中介。

    如果您真的需要所有字节(无论出于何种原因),您可以依赖 System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)Context.FilesDir 相同的事实,这是 context.OpenFileInput() 将使用的,允许:

    byte[] bytes = System.IO.File.ReadAllBytes(
            Path.Combine (
                System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
                "filename.jpg"));
    

    但是,如果这确实是一个缓存,您应该使用Context.CacheDir 而不是Context.FilesDir,这是Path.GetTempPath 返回:

    byte[] cachedBytes = System.IO.File.ReadAllBytes(
            Path.Combine(System.IO.Path.GetTempPath(), "filename.jpg"));
    

    【讨论】:

    • Bitmap bitmap = BitmapFactory.DecodeStream(context.OpenFileInput("filename.jpg")); 我的上帝...直接从文件流中加载图像就可以了。当我真的不需要时,我觉得有必要先将所有内容加载到字节数组中。谢谢你,完美解决了我的问题。
    • 您能告诉我如何从System.Environment.SpecialFolder.Personal 文件夹的子文件夹中加载图像吗?
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2015-04-18
    • 2010-09-24
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多