如果图片可以从 10x10 到 500x500,如何在 PictureBox 中显示图像
How to show an image in PictureBox if the picture can be from 10x10 to 500x500
现在我使用下一个代码将图片从 desctop 下载到 PictureBox
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "BMP|*.bmp";
if (openFileDialog.ShowDialog() != DialogResult.OK)
return;
pictureBox.Load(openFileDialog.FileName);
pictureBox.SizeMode=PictureBoxSizeMode.StretchImage;
pictureBox.BorderStyle = BorderStyle.Fixed3D;
如果我使用普通图片 (100x100),它看起来不错(不模糊)。
如果我使用小图片(15x15),它看起来很模糊。
我想知道如何让它们不模糊(它们可以看起来像砖头,但它们需要不模糊);
小图等待结果需要这样
正常图片的等待结果需要是这样的
你有一个严重的问题。没有简单的解决方案。
I want to know how to make them unfuzzy
不可能。在合理范围内,可以将图像锐化(这就是你想要的)到更大的分辨率,但这需要相当长一段时间 运行 的高级程序。不是在这里作为程序员说话 - 但这是印刷美术摄影的标准步骤。照片的分辨率相对较低(我的分辨率高达 43 兆像素),而打印机的分辨率要高得多。
有一些 AA 方法很简单,但是 10x10 大小 t0 100x100 甚至会挑战最先进的程序 - 10x10 无法使用。你说 10 倍开始时没有数据。
您可以关闭抗锯齿功能,在没有抗锯齿功能的情况下在代码中调整图像大小(很容易做到)- 但这会使真实图片看起来很丑。 .NET 没有真正的高级锐化功能,而且 10x10 不足以开始工作。
最好不要将它们加载到图片框中。将它们加载到位图中,然后将其绘制到最佳大小 (100x100) 的新位图中。这至少让您可以完全控制调整大小。
您可以在以下位置找到相关代码
Scaling a System.Drawing.Bitmap to a given size while maintaining aspect ratio
而
Image resizing in .Net with Antialiasing
告诉您如何select消除锯齿。
但是再说一次:期待很少。这些抗锯齿模式纯粹是技术性的,而不是您用于照片的任何东西。另外 select 正确的图像取决于输入图像 - 因此您可以使用默认值或让用户选择。我可能把事情搞得太复杂了,但在编程之外,我实际上确实处理了需要按比例放大的图像,并尽可能减少图像损失以进行大型打印。
模糊性来自image interpolation. To have your desired blocky look, you need to use nearest neighbour interpolation。
值得庆幸的是,.NET 具有此功能。您可以将插值模式设置为呈现 PictureBox
.
的 GDI Graphics
对象
为此,我建议扩展 PictureBox
用户控件并添加一个 InterpolationMode
parameter. Then, you can override the OnPaint
方法,并使用您的插值模式。
public class InterpolatingPictureBox : PictureBox
{
public InterpolationMode InterpolationMode { get; set; }
protected override void OnPaint(PaintEventArgs eventArgs)
{
eventArgs.Graphics.InterpolationMode = InterpolationMode;
base.OnPaint(eventArgs);
}
}
这是一张 16x16 的图像:,使用
放大到 256x256
NearestNeighbour
(左)
Bilinear
(默认,中间)
HighQualityBilinear
(右)
全部在 InterpolatingPictureBox
控件上呈现。
现在我使用下一个代码将图片从 desctop 下载到 PictureBox
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "BMP|*.bmp";
if (openFileDialog.ShowDialog() != DialogResult.OK)
return;
pictureBox.Load(openFileDialog.FileName);
pictureBox.SizeMode=PictureBoxSizeMode.StretchImage;
pictureBox.BorderStyle = BorderStyle.Fixed3D;
如果我使用普通图片 (100x100),它看起来不错(不模糊)。
如果我使用小图片(15x15),它看起来很模糊。
我想知道如何让它们不模糊(它们可以看起来像砖头,但它们需要不模糊);
小图等待结果需要这样
正常图片的等待结果需要是这样的
你有一个严重的问题。没有简单的解决方案。
I want to know how to make them unfuzzy
不可能。在合理范围内,可以将图像锐化(这就是你想要的)到更大的分辨率,但这需要相当长一段时间 运行 的高级程序。不是在这里作为程序员说话 - 但这是印刷美术摄影的标准步骤。照片的分辨率相对较低(我的分辨率高达 43 兆像素),而打印机的分辨率要高得多。
有一些 AA 方法很简单,但是 10x10 大小 t0 100x100 甚至会挑战最先进的程序 - 10x10 无法使用。你说 10 倍开始时没有数据。
您可以关闭抗锯齿功能,在没有抗锯齿功能的情况下在代码中调整图像大小(很容易做到)- 但这会使真实图片看起来很丑。 .NET 没有真正的高级锐化功能,而且 10x10 不足以开始工作。
最好不要将它们加载到图片框中。将它们加载到位图中,然后将其绘制到最佳大小 (100x100) 的新位图中。这至少让您可以完全控制调整大小。
您可以在以下位置找到相关代码 Scaling a System.Drawing.Bitmap to a given size while maintaining aspect ratio
而
Image resizing in .Net with Antialiasing
告诉您如何select消除锯齿。
但是再说一次:期待很少。这些抗锯齿模式纯粹是技术性的,而不是您用于照片的任何东西。另外 select 正确的图像取决于输入图像 - 因此您可以使用默认值或让用户选择。我可能把事情搞得太复杂了,但在编程之外,我实际上确实处理了需要按比例放大的图像,并尽可能减少图像损失以进行大型打印。
模糊性来自image interpolation. To have your desired blocky look, you need to use nearest neighbour interpolation。
值得庆幸的是,.NET 具有此功能。您可以将插值模式设置为呈现 PictureBox
.
Graphics
对象
为此,我建议扩展 PictureBox
用户控件并添加一个 InterpolationMode
parameter. Then, you can override the OnPaint
方法,并使用您的插值模式。
public class InterpolatingPictureBox : PictureBox
{
public InterpolationMode InterpolationMode { get; set; }
protected override void OnPaint(PaintEventArgs eventArgs)
{
eventArgs.Graphics.InterpolationMode = InterpolationMode;
base.OnPaint(eventArgs);
}
}
这是一张 16x16 的图像:
NearestNeighbour
(左)Bilinear
(默认,中间)HighQualityBilinear
(右)
全部在 InterpolatingPictureBox
控件上呈现。