2009-07-28 23 views
0

Ich baue eine System.Drawing.Bitmap in Code aus einem Byte-Array, und ich bin mir nicht sicher, welche Eigenschaften und so festgelegt werden müssen, damit es ordnungsgemäß als .BMP-Datei gespeichert wird. Ich habe meine Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb); als Konstruktor undErstellen einer Bitmap aus Code; Welche Schritte sind notwendig?

for (int i = 1; i < data.Length; i += 2;) 
    { 
     Color c = new Color(); 
     c.A = data[i]; 
     c.R = data[i]; 
     c.G = data[i]; 
     c.B = data[i]; 
     int x = (i + 1)/2; 
     int y = x/width; 
     x %= width; 
     b.SetPixel(x, y, c); 
    } 

als Code, der die Bitmap-Datensätze (es ist von einem Byte-Array 16-Bit-Lese little'endian Werte enthält, und zum Umwandeln dieser Pixel in Graustufen). Was sollte noch getan werden, um diese Bitmap speicherbar zu machen?

Antwort

1

Sie müssen nichts anderes tun, Sie können die Bitmap direkt nach dem Einstellen der Bilddaten speichern.

Beachten Sie auch, dass die SetPixel Methode in einer Schleife verwendet, ganz langsam, see this link for more information.

+0

Ich bin im Moment lieber für Arbeitscode als für Geschwindigkeit. Das sieht jedoch nach der besten Antwort aus, danke! – RCIX

0

(ab i=1 sieht aus wie ein schlechter Zug, btw - sollte 0?)

Was passiert, wenn Sie versuchen, es zu speichern (b.Save("foo.bmp");)?

Auch; Wenn das ein großes Bild ist, können Sie sich LockBits ansehen; Ein verwandter Beitrag ist here (obwohl er ein rechteckiges Array und kein 1-dimensionales Array verwendet).

+0

ich geraten wurde, das obere Byte jedes 16-Bit-Wert zu werfen, wenn sie auf eine Farbe umwandelt, ist also, warum ich bei 1 beginnen und fügen 2. Ich habe nicht ziemlich zu dem Punkt, an dem ich testen kann, aber ich arbeite daran. – RCIX

1

Eine Instanz der Bitmap Klasse kann durch den Aufruf der Methode Save(string filename) nur als BMP-Datei gespeichert werden.

Wie in anderen Antworten erwähnt, ist die Einstellung der einzelnen Pixel in einer Schleife ein wenig langsam.

Auch Sie können nicht die Eigenschaften einer Color Struktur gesetzt, müssen Sie es wie folgt erstellen:

Color c = Color.FromArgb(data[i], data[i + 1], data[i + 2], data[i + 3]); 

(nicht sicher, was in Ihren Daten ist [] array)

+0

Ich habe seither eine alternative Methode zum Konvertieren meiner Daten in int-Werte ausgearbeitet, danke trotzdem! – RCIX

0

Ihre Formel zur Berechnung von Graustufen wird normalerweise nicht verwendet. Zugegeben, es wird sehr gut funktionieren, aber Sie wollen höchstwahrscheinlich den Standard einhalten. Das Auge ist für einige Farben empfänglicher (grün), so dass Sie normalerweise ein anderes Wiegen verwenden. Ich würde die Farbe so einstellen;

c.R = 0.3 * data[i]; 
c.G = 0.59 * data[i]; 
c.B = 0.11 * data[i]; 
c.A = 1; 

Siehe Wikipedia article on Grayscale für weitere Informationen

Verwandte Themen