Как мне просмотреть "необработанные" данные изображения в формате PNG

StackOverflow https://stackoverflow.com/questions/350736

  •  20-08-2019
  •  | 
  •  

Вопрос

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

Кодекс (любезно предоставленный здесь) приведенное ниже отлично работает для некоторых форматов файлов PNG, но когда я пробую настоящий 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));
        }
    }
Это было полезно?

Решение

Кодировщик BMP не поддерживает форматы 48bpp.Вы можете взломать пиксели с помощью Bitmap.Метод LockBits().Хотя в статье библиотеки MSDN для PixelFormat говорится, что 48 бит / с обрабатываются как изображения с частотой 24 бит / с, на самом деле я вижу 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top