2016-08-12 6 views
0

イメージを別のイメージから「コピー」し、そのイメージの高さと幅を減らし、ストリームとして戻して別のクラスで取得し、イメージとして表示しようとしています。しかし、私が他のクラスのストリームを取得し、例外がスローされます。 msgstr "閉じたストリームにアクセスできません" msgid。クローズドストリームにアクセスできない例外

このメソッドは、イメージパスを取得し、サイズを縮小してストリームとして返します。

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; 
     } 
    } 

このメソッドは、ストリームを受信し、あなたがusingブロックを使用しているので、あなたがMemoryStreamを処分している

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

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

答えて

2

イメージ・ソースでそれを設定します。後でコードで戻り値を使用しようとすると、使用できなくなります。

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()と呼んでください。

+0

ありがとうございました!もう1つの質問、 'var ImagenCopia = Bitmap.CreateScaledBitmap(ImageOrig、80,80、false);'は正しいですか?イメージがimg.Sourceに表示されず、エラーメッセージや何も表示されないため、動作しているとは思われません。( –

+0

問題はない@Samir。私はよく分からない。その特定の問題に関するすべての関連する詳細と新しい質問。 –

+0

私はそれを行うよ!もう一度ありがとう!:) –

関連する問題