2008-12-08 6 views
1

Я пытаюсь написать приложение, которое преобразует 48-бит-пиксельные PNG-файлы в собственный (Bayer) формат.Как просмотреть «необработанные» данные изображения PNG

Код (любезность here) ниже отлично подходит для некоторых форматов PNG-файлов, но когда я пытаюсь использовать bona fide 48-битный PNG, код генерирует исключение - есть ли альтернатива?

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)); 
     } 
    } 
+0

Может быть, вы хотите сказать нам текст, за исключением? –

ответ

4

Кодер BMP не поддерживает форматы 48bpp. Вы можете получить трещину в пикселях с помощью метода Bitmap.LockBits(). Хотя в статье MSDN Library для PixelFormat говорит, что 48bpp рассматривается как 24bpp изображений, я на самом деле вижу 6 байт пикселей с этим кодом:

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); 
+0

Спасибо, что отлично работал. – Jamie