Pregunta

Estoy tratando de escribir una aplicación que convierta archivos PNG de 48 bits por píxel a un formato propietario (Bayer).

El código (cortesía aquí ) a continuación funciona muy bien para algunos formatos de archivo PNG, pero cuando pruebo un PNG de 48 bits de buena fe, el código arroja una excepción: ¿hay alguna alternativa?

    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));
        }
    }
¿Fue útil?

Solución

El codificador BMP no admite formatos de 48 bpp. Puede obtener una grieta en los píxeles con el método Bitmap.LockBits (). Aunque el artículo de MSDN Library para PixelFormat dice que 48bpp se trata como imágenes de 24bpp, de hecho veo píxeles de 6 bytes con este código:

  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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top