2017-05-18 4 views
1

Ich habe ein System.Windows.Media.Drawing Objekt, das ich in ein Bitmap Objekt konvertieren möchte, und dann von dort die Bytes extrahieren, die das Bild darstellen. Ich habe über das Internet nachgeschaut und ich finde nicht, wie ich das tun kann, was ich brauche, also würde jede Hilfe geschätzt werden.Konvertieren eines System.Windows.Media.Drawing-Objekts in Bitmap-Bytes

+0

Können Sie Code verwenden? Was für einen Fehler hast du? – aloisdg

+0

Es ist kein Fehler, ich weiß einfach nicht, wie ich von einem Objekt zum anderen komme. –

+0

Ja das habe ich getan, das habe ich in meiner Frage gesagt. Nach mehr Nachforschungen gestern habe ich einen Weg gefunden, der ein 'DrawingVisual' verwendet, um einen 'DrawingContext' zu erstellen, in den ich meine' Drawing' zeichne. Von da aus kann ich zu einer' Bitmap' oder 'BitmapSource' gelangen Objekt durch einen anderen Umweg, der mich schließlich die Bytes durch einen 'MemoryStream' extrahieren lässt. Es ist nicht schön, und ich fand das erst gestern spät, als ich verschiedene Bits zusammenfügte, die ich online fand. –

Antwort

0

So fand ich endlich einen Weg ein System.Windows.Media.Drawing Objekt zu einem System.Drawing.Bitmap Objekt zu konvertieren, und dass ein byte[] Objekt erhalten, die Bilddaten darstellen. Das Folgende ist nicht schön, aber funktioniert tatsächlich.

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

Also ja, es ist schrecklich, aber es funktioniert tatsächlich.