如果图片可以从 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 控件上呈现。