我似乎无法以编程方式创建彩色位图以在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图片框中显示的结果位图:
如何在PictureBox上设置图像,使其正确显示彩色位图(完整实体)?
编辑:我只能生成较小的源位图,因此不可避免地升级到PictureBox。生成的源位图为4px或100px square时出现问题,因此我认为这些是相关的情况。
编辑:应将PictureBox缩放设置为拉伸或缩放以显示问题。在此示例中,4x4源位图被拉伸到300x300。
编辑:基本问题是PictureBox无法将小位图升级为大型控件。这很令人困惑,因为位图很好地升级为PictureBox.Background
图像。除非你有一个可以解决图像升级问题的神奇子弹,否则我认为最好在你的答案中找到清晰简单的解决方法。
答案 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;
瓦尔特