【问题标题】:Cannot access a closed stream Exception无法访问关闭的流异常
【发布时间】:2016-08-12 16:46:45
【问题描述】:

我正在尝试从另一个图像“复制”一个图像,减小它的高度和宽度,并将其作为流返回以在另一个类中检索并显示为图像。但是当我在另一个类中获得流时,抛出异常; “无法访问关闭的流”。

该方法获取图片路径,缩小图片大小并作为流返回。

public Stream getImagenCopia (string dataImagen)
    {
        Bitmap ImageOrig = BitmapFactory.DecodeFile (dataImagen);
        var ImagenCopia = Bitmap.CreateScaledBitmap (ImageOrig, 80, 80, false);


        using (MemoryStream ms = new MemoryStream ())
        {
            ImagenCopia.Compress (Bitmap.CompressFormat.Jpeg, 40, ms);

            return ms;
        }
    }

此方法接收流并将其设置在图像源中

var cim = auxFotos.getImagenCopia(path);
setImagen(img, cim);

void setImagen (Image img, Stream strm)
    {
        img.Source = ImageSource.FromStream (() =>
        {
            return strm;
        });
    }

【问题讨论】:

    标签: c# stream xamarin.android xamarin.forms memorystream


    【解决方案1】:

    您正在处理 MemoryStream,因为您正在使用 using 块。当您稍后尝试在代码中使用返回值时,它已不可用。

    using (MemoryStream ms = new MemoryStream ())
    {
        ImagenCopia.Compress (Bitmap.CompressFormat.Jpeg, 40, ms);
    
        return ms;
    }
    

    删除using 语句:

    Bitmap ImageOrig = BitmapFactory.DecodeFile(dataImagen);
    var ImagenCopia = Bitmap.CreateScaledBitmap(ImageOrig, 80, 80, false);
    
    var ms = new MemoryStream());
    ImagenCopia.Compress(Bitmap.CompressFormat.Jpeg, 40, ms);
    return ms;
    

    如果您看到由于资源没有被垃圾回收而导致内存消耗激增,您可能需要在使用完毕后手动清理它,也许可以通过调用 .Dispose() 来清理它。

    【讨论】:

    • 谢谢格兰特!!另一个问题,var ImagenCopia = Bitmap.CreateScaledBitmap(ImageOrig,80,80,false); 对吗?我认为它不起作用,因为图像没有出现在 img.Source 中,而且我没有收到错误消息或任何东西:(
    • 好的,我会做的!再次感谢你! :)
    猜你喜欢
    • 2013-06-10
    • 2011-01-20
    • 2021-01-08
    • 1970-01-01
    • 2011-12-27
    • 2012-06-11
    • 2021-12-21
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多