自定义位图对象在 PictureBox 中显示不正确
Custom bitmap object isn't displaying correctly in PictureBox
我正在尝试通过代码以非常小的尺寸生成自定义位图并将其显示为 PictureBox
,放大以适合所述 PictureBox
。我正在使用图形对象来执行此操作,以便使用 NearestNeighbor 插值 完美地放大单个像素。
我正在使用临时默认图像的图形对象,该图像位于 Form.Load
上的 PictureBox
s“图像”组件中,其大小已调整为完美的宽度和高度以保持原始位图的正确纵横比。
相关代码如下:
private void Form1_Load(object sender, EventArgs e)
{
bmp = new Bitmap(16, 9, PixelFormat.Format24bppRgb);
rnd = new Random();
GenerateImage();
}
private void GenerateImage()
{
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
int num = rnd.Next(2);
if (num == 0)
{
bmp.SetPixel(x, y, Color.White);
}
else
{
bmp.SetPixel(x, y, Color.Gold);
}
}
}
Bitmap image = new Bitmap(picOutput.Image);
grp = Graphics.FromImage(image);
grp.InterpolationMode = InterpolationMode.NearestNeighbor;
grp.DrawImage(
bmp,
new Rectangle(0, 0, image.Width, image.Height),
0,
0,
bmp.Width,
bmp.Height,
GraphicsUnit.Pixel
);
grp.Dispose();
picOutput.Image = image;
}
问题是 Bitmap
好像画错了。当通过 PictureBox
显示时,原始 Bitmap
的大约半个像素在位图的左侧和顶部边缘被截断,并且大约半个像素显示为右侧的原始默认图像和底部边缘。这几乎就像 Bitmap
在被图形对象绘制时向上和向左偏移,它并没有像预期的那样完美地覆盖原始默认图像。
我的第一个想法是 PictureBox
s SizeMode,它仍然设置为“正常”,但其中 none 完全改变了问题。 Here是图片的问题。右边和底部的黑色边缘是临时默认图像(我使用图形的图像)的一部分,它完全是黑色的,覆盖了整个 PictureBox
区域。
谁能提供一些见解?
正如用户 Jimi 在评论中指出的那样, post 中的 grp.PixelOffsetMode = PixelOffsetMode.Half
解决了这个问题。
我正在尝试通过代码以非常小的尺寸生成自定义位图并将其显示为 PictureBox
,放大以适合所述 PictureBox
。我正在使用图形对象来执行此操作,以便使用 NearestNeighbor 插值 完美地放大单个像素。
我正在使用临时默认图像的图形对象,该图像位于 Form.Load
上的 PictureBox
s“图像”组件中,其大小已调整为完美的宽度和高度以保持原始位图的正确纵横比。
相关代码如下:
private void Form1_Load(object sender, EventArgs e)
{
bmp = new Bitmap(16, 9, PixelFormat.Format24bppRgb);
rnd = new Random();
GenerateImage();
}
private void GenerateImage()
{
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
int num = rnd.Next(2);
if (num == 0)
{
bmp.SetPixel(x, y, Color.White);
}
else
{
bmp.SetPixel(x, y, Color.Gold);
}
}
}
Bitmap image = new Bitmap(picOutput.Image);
grp = Graphics.FromImage(image);
grp.InterpolationMode = InterpolationMode.NearestNeighbor;
grp.DrawImage(
bmp,
new Rectangle(0, 0, image.Width, image.Height),
0,
0,
bmp.Width,
bmp.Height,
GraphicsUnit.Pixel
);
grp.Dispose();
picOutput.Image = image;
}
问题是 Bitmap
好像画错了。当通过 PictureBox
显示时,原始 Bitmap
的大约半个像素在位图的左侧和顶部边缘被截断,并且大约半个像素显示为右侧的原始默认图像和底部边缘。这几乎就像 Bitmap
在被图形对象绘制时向上和向左偏移,它并没有像预期的那样完美地覆盖原始默认图像。
我的第一个想法是 PictureBox
s SizeMode,它仍然设置为“正常”,但其中 none 完全改变了问题。 Here是图片的问题。右边和底部的黑色边缘是临时默认图像(我使用图形的图像)的一部分,它完全是黑色的,覆盖了整个 PictureBox
区域。
谁能提供一些见解?
正如用户 Jimi 在评论中指出的那样,grp.PixelOffsetMode = PixelOffsetMode.Half
解决了这个问题。