当调色板Alpha为零时,无法在pictureBox中显示单色BMP文件

时间:2018-07-04 03:13:06

标签: c# bitmap image-manipulation bmp

我已经成功生成了一个BMP文件。 (尽管如此,我仍然在调整格式上的一些更改)。我用PictureBox创建了一个winform。在我的最后一个问题之后,我现在可以保存文件,但是现在位图无法显示在PictureBox中。这发生在我更改了调色板并跟随this answer 以将颜色的Alpha设置为0

之后

我的bmp像this answer中所述是单色的(我想知道是否有更简单的方法)

我的代码是

 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 (如您所见,仅A组件已更改)

黑白变量

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标头中的“重要颜色数”?

编辑: 我尝试了alpha设置(例如128),我只能看到图片的亮色略少(如灰色)。 这仅在显示bmp时发生。保存的文件是正确的黑白

picturebox和alpha之间有什么关系...

1 个答案:

答案 0 :(得分:0)

Alpha表示颜色的不透明度。 0表示颜色是完全透明的,即您将只看到画布/背景,128表示颜色是50%的透明意味着您将看到相同数量的颜色和背景,255表示完全不透明/零透明度意味着您将仅看到颜色。

简而言之,白色是“ FFFFFFFF”,黑色是“ FF000000”。

如果要通过其RGB分量指定颜色,请使用带有三个参数的FromArgb方法,这三个参数会将Alpha通道隐式设置为255。