2017-05-18 13 views
1

オブジェクトに変換したい画像を表すバイトを抽出するSystem.Windows.Media.Drawingオブジェクトがあります。私はインターネットについて見てきました。私は必要なことをする方法を見つけることができないので、どんな助けもありがたいです。System.Windows.Media.Drawingオブジェクトをビットマップのバイトに変換する

+0

いくつかのコードを使用して表示できますか?どのようなエラーがありますか? – aloisdg

+0

それはエラーではない、私はちょうど1つのオブジェクトから他のオブジェクトに到達する方法を知らない。 –

+0

はい、私は私の質問でそう言った。より多くの研究の後、昨日私は 'DrawingVisual'を使って' DrawingContext'を作成し、 'Drawing'を描画する方法を見つけたと思います。そこから、' Bitmap'または 'BitmapSource'オブジェクトをいくつかのラウンドアバウト方法で処理して、最後に 'MemoryStream'を通してバイトを抽出させます。それは綺麗ではないし、昨日遅くまで私がオンラインで見つけたさまざまなビットをつなぎ合わせることでそれを見つけられなかった。 –

答えて

0

だから私は最終的にSystem.Drawing.BitmapオブジェクトにSystem.Windows.Media.Drawingオブジェクトを変換する方法を発見し、そこから画像データを表すbyte[]オブジェクトを取得します。以下はきれいではありませんが、実際には動作します。

public static byte[] DrawingToBytes(Drawing drawing) 
{ 
    DrawingVisual visual = new DrawingVisual(); 
    using (DrawingContext context = visual.RenderOpen()) 
    { 
     // If using the BitmapEncoder uncomment the following line to get a white background. 
     // context.DrawRectangle(Brushes.White, null, drawing.bounds); 
     context.DrawDrawing(drawing); 
    } 

    int width = (int)(drawing.Bounds.Width) 
    int height = (int)(drawing.Bounds.Height) 
    Bitmap bmp = new Bitmap(width, height); 
    Bitmap bmpOut; 

    using (Graphics g = Graphics.FromImage(bmp)) 
    { 
     g.Clear(System.Drawing.Color.White); 
     RenderTargetBitmap rtBmp = new RenderTargetBitmap(width, height, 
              bmp.HorizontalResolution, 
              bmp.VerticalResolution, 
              PixelFormats.Pbgra32); 
     rtBmp.Render(visual); 

     // Alternative using BmpBitmapEncoder, use in place of what comes after if you wish. 
     // MemoryStream stream = new MemoryStream(); 
     // BitmapEncoder encoder = new BmpBitmapEncoder(); 
     // encoder.Frames.Add(BitmapFrame.Create(rtBmp)); 
     // encoder.save(stream); 

     int stride = width * ((rtBmp.Format.BitsPerPixel + 7)/8); 
     byte[] bits = new byte[height * stride]; 
     bitmapSource.CopyPixels(bits, stride, 0); 

     unsafe 
     { 
      fixed (byte* pBits = bits) 
      { 
       IntPtr ptr = new IntPtr(pBits); 
       bmpOut = new Bitmap(width, height, stride, 
            System.Drawing.Imaging.PixelFormat.Format32bppPArgb, ptr); 
      } 
     } 

     g.DrawImage(bmpOut, 0, 0, bmp.Width, bmp.Height); 
    } 

    byte[] bytes; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     bmp.Save(ms, ImageFormat.bmp); 
     data = ms.ToArray(); 
    } 

    return bytes; 
} 

ええ、それは恐ろしいですが、実際には機能します。

関連する問題