2016-11-18 10 views
-3

次はすべてC#で書かれています。 さまざまなグラフィックメソッドを使用してキャンバス(LevelPanel)に描画し、XMLファイルに保存しています。私は、文字列に変換することによりそう:Windowsフォームアプリケーション変換文字列をキャンバスに描画

private void Save_Click(object sender, EventArgs e) 
    { 
     string filename = FileNameBox.Text; 

     Bitmap bmp = new Bitmap(LevelPanel.Width, LevelPanel.Height); 
     Graphics g = Graphics.FromImage(bmp); 
     Rectangle rect = LevelPanel.RectangleToScreen(LevelPanel.ClientRectangle); 
     g.CopyFromScreen(rect.Location, Point.Empty, LevelPanel.Size); 
     g.Dispose(); 
     string picString = ""; 

     using (MemoryStream m = new MemoryStream()) 
     { 
      bmp.Save(m, ImageFormat.Png); 
      picString = Convert.ToBase64String(m.ToArray()); 
      m.Close(); 
     } 
     File.WriteAllText(@filename, picString); 

    } 

私は、ファイルを読み込むことができます任意の方法は、(文字列を取り、画像に戻ってそれを変換)あります。私は周りを見回しましたが、これで何も見つかりませんでした。どんな援助も感謝して受け入れられます。それが不可能な場合は、誰かがxmlファイルとして画像を保存/読み込む別の方法を提案することができます。あなただけのXMLファイルを読んだ後、この

string base64String = File.ReadAllText("somefile.xml"); 

のようなXMLを読むあなたは、このメソッドを呼び出すことにより、画像に戻って、それを変換することができますFile.WriteAllText("somefile.xml", picString);

でXMLを保存している場合

答えて

0

public static Image ImageFromBase64String(string base64String) 
{ 
    byte[] imageBytes = Convert.FromBase64String(base64String); 

    using (MemoryStream ms = new MemoryStream(imageBytes)) 
    { 
     return new Bitmap(Image.FromStream(ms, true)); 
    } 
} 
+0

ありがとうございました。それをPannelに戻すと、システムのメモリが足りなくなります。LevelPanel.BackgroundImage = Imageを使用しています。前と同じようにコンパイルします。何か案は? – CyberRat

+0

この行の答えを更新しました '新しいビットマップを返します(Image.FromStream(ms、true));'。しかし、あなたが大きな画像を使って作業しているのでなければ、メモリが不足しています。画像を使い終わったら、あなたの画像を処分することを忘れないでください。 –

+0

ええ、私はそれらを処分するのを忘れていました。しかし、disposeコマンドをどこに置くべきか分かりません。ロード直後に.Dispose()を使用すると、次のエラーが表示されます。System.Drawing.dllで未処理の 'System.ArgumentException'例外が発生し、パラメータは無効です。 – CyberRat

関連する問題