生成的位图在PictureBox中奇怪地显示

时间:2014-02-19 00:37:55

标签: c# .net windows winforms picturebox

我似乎无法以编程方式创建彩色位图以在PictureBox中显示。位图通常保存为文件,但在PictureBox中显示时在边缘处褪色。这是用于创建和显示位图的简化代码(在实际代码中,位图生成与表单完全分离,因此强制位图大小与图片框大小相匹配是不可能的):< / p>

    Bitmap Bmp = new Bitmap(4, 4, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    using (Graphics gfx = Graphics.FromImage(Bmp))
    using (SolidBrush brush = new SolidBrush(Color.BlueViolet))
    {
        gfx.FillRectangle(brush, 0, 0, 4, 4);
    }

然后将PictureBox上的Image值设置为生成的位图:

    pictureBox1.Image = Bmp;

以下是在300x300图片框中显示的结果位图:

Generated bitmap in a 300x300 PictureBox

如何在PictureBox上设置图像,使其正确显示彩色位图(完整实体)?

编辑:我只能生成较小的源位图,因此不可避免地升级到PictureBox。生成的源位图为4px或100px square时出现问题,因此我认为这些是相关的情况。

编辑:应将PictureBox缩放设置为拉伸或缩放以显示问题。在此示例中,4x4源位图被拉伸到300x300。

编辑:基本问题是PictureBox无法将小位图升级为大型控件。这很令人困惑,因为位图很好地升级为PictureBox.Background图像。除非你有一个可以解决图像升级问题的神奇子弹,否则我认为最好在你的答案中找到清晰简单的解决方法。

3 个答案:

答案 0 :(得分:2)

您正在生成一个4x4位图并且正在被拉伸。改为指定与图片框匹配的尺寸:

        int width = pictureBox1.Width;
        int height = pictureBox1.Height;
        var Bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        using (Graphics gfx = Graphics.FromImage(Bmp))
        using (var brush = new SolidBrush(Color.BlueViolet))
        {
            gfx.FillRectangle(brush, 0, 0, width, height);
        }
        pictureBox1.Image = Bmp;

答案 1 :(得分:0)

您需要关闭抗锯齿功能。此外,由于您在整个图片框中使用一种颜色,为什么不将位图设为1x1?如果您需要4x4,请将示例顶部的int从1更改为4.

int hw = 1;
Bitmap Bmp = new Bitmap(hw, hw, 
                        System.Drawing.Imaging.PixelFormat.Format24bppRgb);
using (Graphics gfx = Graphics.FromImage(Bmp))
{
  // Turn off anti-aliasing and draw an exact copy
  gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
  gfx.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

  using (SolidBrush brush = new SolidBrush(Color.BlueViolet))
  {
    gfx.FillRectangle(brush, 0, 0, hw, hw);
  }
}
pictureBox1.Image = Bmp;

更新

由于通过将图片框设置为图像仍然存在同样的问题,您必须从图片框中获取图形对象并直接在其上绘图。

代码非常相似。

using (Graphics gfx = Graphics.FromImage(pictureBox1.Image))
{
  // Turn off anti-aliasing and draw an exact copy
  gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
  gfx.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

  using (SolidBrush brush = new SolidBrush(Color.BlueViolet))
  {
    gfx.FillRectangle(brush, 0, 0, 
                      pictureBox11.Width - 1, 
                      pictureBox11.Height - 1);
  }
}

// Force the picturebox to redraw with the new image.
// You could also use pictureBox11.Refresh() to do the redraw.
pictureBox11.Invalidate();

答案 2 :(得分:0)

我尝试测试您的代码并正确显示图像 但是当我使用这段代码时:

Rectangle srcRect = New Rectangle(0, 0, Bmp.Width, Bmp.Height);
Rectangle dstRect = New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height);
g = PictureBox1.CreateGraphics;
g.DrawImage(Bmp, dstRect, srcRect, GraphicsUnit.Pixel);
g.Dispose();

我确实得到了你的结果。为了解决它:

Rectangle srcRect = New Rectangle(0, 0, Bmp.Width - 1, Bmp.Height - 1);
Rectangle dstRect = New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height);
g = PictureBox1.CreateGraphics;
g.DrawImage(Bmp, dstRect, srcRect, GraphicsUnit.Pixel);
g.Dispose();

编辑:

所以你有位图,你想要拉伸它。并且位图具有纯色。这样做了:

Color pixelColor = Bmp.GetPixel(0, 0);
PictureBox1.BackColor = pixelColor;

瓦尔特