2017-11-24 70 views
0

InkCanvasを使用するWPFアプリケーションがあります。ビットマップをレンダリングし、メモリストリームに保存し、結果のバイトをファイルに書き込み、ペイントでそのファイルを開くと、イメージはマングリングされます。私がここで間違っているかもしれないどんな考え? SOとcodeprojectで見つかったいくつかのソリューションを試してみました。 InkCanvasの一部をキャプチャしているのは明らかですが、その大部分は黒です(nullバイトと仮定します)。InkCanvasをファイルにバイト配列に保存すると画像が変形する

EDIT:マージンあり/なし。ここで私が試した他のリンクは以下のとおりです。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ba4dc89f-0169-43a9-8374-68e1fb34a222/saving-inkcanvas-as-image?forum=wpf

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ef71237c-5dfb-4d6c-a402-e8cb02b74e99/how-to-convert-inkcanvas-strokes-to-a-bitmap-or-byte-array?forum=wpf

Converting InkCanvas Strokes to a Byte Array and back again

InkCanvas Load/Save operations

http://www.centrolutions.com/Blog/post/2008/12/09/Convert-WPF-InkCanvas-to-Bitmap.aspx

は、私は、ビットマップ/ PNGする結果ファイルを必要とします他のマシンで見ることができます。

InkCanvasから
private byte[] ConvertInkCanvasToByteArray() 
{ 
    int margin = (int)this.icSignature.Margin.Left; 
    int width = (int)this.icSignature.ActualWidth - margin; 
    int height = (int)this.icSignature.ActualHeight - margin; 

    RenderTargetBitmap rtb = new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default); 
    rtb.Render(icSignature); 

    BmpBitmapEncoder encoder = new BmpBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 
    byte[] bitmapBytes; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     encoder.Save(ms); 
     ms.Position = 0; 
     bitmapBytes = ms.ToArray(); 
    } 
    return bitmapBytes; 
} 

enter image description here

そして、マングルされた: enter image description here

答えて

1

InkCanvas'余裕をもってすべての問題を避けるために、あなたは中間のDrawingVisualにそれを描くことができます:

private byte[] ConvertInkCanvasToByteArray() 
{ 
    var rect = new Rect(icSignature.RenderSize); 
    var visual = new DrawingVisual(); 

    using (var dc = visual.RenderOpen()) 
    { 
     dc.DrawRectangle(new VisualBrush(icSignature), null, rect); 
    } 

    var rtb = new RenderTargetBitmap(
     (int)rect.Width, (int)rect.Height, 96d, 96d, PixelFormats.Default); 
    rtb.Render(visual); 

    var encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 

    using (var stream = new MemoryStream()) 
    { 
     encoder.Save(stream); 
     return stream.ToArray(); 
    } 
} 
+0

ありがとう@クレメンス、これは完全に問題を解決しました。とても有難い! – joelc

関連する問題