Wie kann ich ‚raw‘ PNG Bilddaten anzuzeigen
Frage
Ich versuche, eine Anwendung zu schreiben, die 48-Bit-pro-Pixel konvertiert PNG-Dateien in einem proprietären (Bayer) Format.
Der Code (mit freundlicher Genehmigung hier ) unten arbeitet für einige PNG-Dateiformate groß, aber wenn ich ein bona fide 48 Bits versuchen, eine Ausnahme des Code PNG wirft - ist es eine Alternative
static public byte[] BitmapDataFromBitmap(Bitmap objBitmap)
{
MemoryStream ms = new MemoryStream();
objBitmap.Save(ms, ImageFormat.BMP); // GDI+ exception thrown for > 32 bpp
return (ms.GetBuffer());
}
private void Bayer_Click(object sender, EventArgs e)
{
if (this.pictureName != null)
{
Bitmap bmp = new Bitmap(this.pictureName);
byte[] bmp_raw = BitmapDataFromBitmap(bmp);
int bpp = BitConverter.ToInt32(bmp_raw, 28); // 28 - BMP header defn.
MessageBox.Show(string.Format("Bits per pixel = {0}", bpp));
}
}
Lösung
Der BMP-Encoder unterstützt keine 48bpp-Formate. Sie können mit den Bitmap.LockBits an den Pixeln einen Riss bekommen () -Methode. Obwohl der MSDN Library-Artikel für Pixelformat sagt, dass 48bpp wie 24bpp Bilder behandelt wird, kann ich in der Tat 6 Byte Pixel sah mit diesem Code:
Bitmap bmp = new Bitmap(@"c:\temp\48bpp.png");
BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format48bppRgb);
// Party with bd.Scan0
//...
bmp.UnlockBits(bd);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow