2016-07-13 16 views
0

Ich benutze Microsoft Surface 2.0 SDK mit SUR40 PixelSense-kompatiblen Computer. Ich muss das Bild von seiner Berührung erfassen und es als .bmp speichern. Da das Surface SDK mit dem RawImageVisualizer-Beispiel geliefert wird, bei dem das Bild über Berührung auf dem Bildschirm angezeigt wird, habe ich versucht, das Programm zum Schreiben von Bildern auf die Festplatte zu ändern. Das Problem ist, ich bekomme ArgumentException: Parameter is invalid während der Erstellung Image von Byte-Array von Touch erfasst. DieseCapture Bild von Touch von PixelSense-kompatiblen PC und speichern Sie es als. Bmp

ist, wie ich Byte-Array mit Bilddaten von FrameReceivedEventArgs auf FrameReceived Ereignis abrufen:

event.UpdateRawImage(
       ImageType.Normalized, 
       normalizedImage, 
       0, 0, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaWidth, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaHeight); 

Und das ist, wie ich versuche, Bytes als .bmp auf Platte zu schreiben:

System.Drawing.Image img; 
using (System.Drawing.Image raw = System.Drawing.Image.FromStream(new MemoryStream(normalizedImage))) 
{ 
    img = raw.Clone() as System.Drawing.Bitmap; 
} 
img.Save("C:/img.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 

Also ich Die Ausnahme versucht Image aus dem Stream zu erstellen. Nichtsdestotrotz funktioniert dieses Byte-Array völlig problemlos mit Texture2D und SpriteBatch, die es anzeigt. Wie kann ich ArgumentException beheben?

Antwort

0

Ich habe gerade festgestellt, dass UpdateRawImage nicht eine Byte-Darstellung von PNG Datei zurückgibt, sondern nur ein Array von Pixeln. Um daraus ein Bild zu erstellen, müssen alle anderen Teile der Dateistruktur in das Array geschrieben werden: Kopfzeile und Farbtabelle (falls erforderlich). In vielen Fällen kann dies einfach mit einem der System.Drawing.Bitmap Bauer erfolgen:

public Bitmap(
    int width, 
    int height, 
    int stride, 
    PixelFormat format, 
    IntPtr scan0 
) 

Aber ich war nicht so viel Glück, weil UpdateRawImage kehrt Graustufen- Pixel 8bpp und PixelFormat Enum nicht unterstützt (die meisten in der Nähe ist Format16bppGrayScale, aber es verwendet 2 Bytes für Pixel, nicht eins). In dieser besonderen Situation gibt es zwei offensichtliche Lösungen. Das erste ist eine neue Pixelreihe, die einen der Standards PixelFormat erfüllt (das war meine Wahl, weil ich ein 24-Bit-RGB-Bild brauche, obwohl es eigentlich nur schwarz-weiß mit nur 256 Farben ist). Die zweite schreibt BMP Header manuell (und es ist nicht sehr schwierig, wegen der offenen Spezifikationen).