Ошибка отображения монохромного BMP-файла в pictureBox, когда палитра альфа равна нулю - PullRequest
0 голосов
/ 04 июля 2018

Я успешно сгенерировал файл BMP. (Я все еще настраиваю некоторые изменения в формате, который я должен сделать, хотя). Я создал winform с PictureBox. После моего последнего вопроса я теперь могу сохранить файл, но теперь растровое изображение не может быть отображено в PictureBox. Это произошло после того, как я изменил палитру после этого ответа , чтобы установить альфа цветов в 0

Мой BMP монохромный, как преподается в этом ответе (Интересно, может ли быть более простой способ)

Мой код

 private void btnNameUsage_Click(object sender, EventArgs e)
  {
   Bitmap bmp = new Bitmap(width, height);
   // Bitmap bmp = new Bitmap(width, height, PixelFormat.Format1bppIndexed); //This does not work

     bmp.SetResolution(300.0F, 300.0F);

    string name = "Hello how are you";
    string date = DateTime.Now.Date.ToString();      
    using (Graphics thegraphics = Graphics.FromImage(bmp))
      {

      string complete = date + "\n" + name ;


      thegraphics.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);

      using (Font font1 = new Font("Arial", 24, FontStyle.Regular, GraphicsUnit.Pixel))
      using (var sf = new StringFormat()
          {
            Alignment = StringAlignment.Center,
            LineAlignment = StringAlignment.Center,
          })
          {
          thegraphics.DrawString(complete, font1, Brushes.Black, new Rectangle(0, 0, bmp.Width, bmp.Height), sf);
           }
      }

    //add
    BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format1bppIndexed);

    Bitmap newBitmap = new Bitmap(width, height, bmpData.Stride, PixelFormat.Format1bppIndexed, bmpData.Scan0);
    newBitmap.SetResolution(300.0F, 300.0F);

    //we modify the palette THIS MAKES THE BMP NOT SHOWN IN PIT BOX

     ColorPalette palette = newBitmap.Palette;
     palette.Entries[0] = black;  //black is a type Color
     palette.Entries[1] = white;  //white is a type Color
     newBitmap.Palette = palette;


     picBoxImage.Image = newBitmap;  //THIS fails
     newBitmap.Save(@"theImage.bmp", ImageFormat.Bmp); //This works!

     }

Я должен уточнить, что сгенерированные палитры по умолчанию имеют следующие цвета: (RGBA): черный: 000000FF и белый: FFFFFFFF (с этой палитрой я вижу bmp в пикбоксе), но я меняю черный: 00000000 и белый: FFFFFF00 (как видите, только компонент А изменен)

переменные черного и белого цвета

Color black = new Color();
Color white = new Color();
white = Color.FromArgb(0, 255, 255, 255); //the 0 is alpha zero
black = Color.FromArgb(0, 0, 0, 0);  //the first 0 is alpha zero

Интересно, почему это не показывается?

В качестве дополнительного вопроса, как я могу изменить «количество важных цветов» в заголовке DIB?

EDIT: Я экспериментировал с настройкой альфа (например, 128), и я мог видеть картинку только чуть менее яркими цветами (как в сером) Это происходит только при отображении BMP. Сохраненный файл правильно черно-белый

Какая связь между картинкой и альфа ...

1 Ответ

0 голосов
/ 04 июля 2018

Альфа обозначает непрозрачность цвета. 0 означает, что цвет полностью прозрачен, т.е. вы увидите только холст / фон, 128 означает, что цвет прозрачен на 50%, что означает, что вы увидите цвет и фон в одинаковом количестве, 255 означает полную непрозрачность / нулевую прозрачность, что означает, что вы будете только см. цвет.

Короче говоря, белый - это "FFFFFFFF", а черный - это "FF000000".

Если вы хотите задать цвета по их компонентам RGB, используйте метод FromArgb с тремя параметрами, которые неявно устанавливают альфа-канал на 255.

...