如果图片可以从10x10到​​500x500,如何在PictureBox中显示图像

时间:2016-03-04 11:34:46

标签: c# image picturebox

现在我使用下一个代码将图片从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),它看起来不错(不模糊)。

enter image description here

如果我使用了一张小图片(15x15),它看起来很模糊。

This picture has 15x15 size

我想知道如何使它们不模糊(它们看起来像砖块,但它们需要不模糊);

小图片的等待结果需要看起来像这样

enter image description here

正常图片的等待结果需要看起来像这样

enter image description here

2 个答案:

答案 0 :(得分:4)

模糊来自image interpolation。要获得所需的块状外观,您需要使用nearest neighbour interpolation

值得庆幸的是,.NET已经构建了这个版本。您可以将插值模式设置为呈现Graphics的GDI PictureBox对象。

为此,我建议您使用PictureBox用户控件并添加InterpolationMode参数。然后,您可以覆盖OnPaint方法,并使用插值模式。

public class InterpolatingPictureBox : PictureBox
{
    public InterpolationMode InterpolationMode { get; set; }

    protected override void OnPaint(PaintEventArgs eventArgs)
    {
        eventArgs.Graphics.InterpolationMode = InterpolationMode;
        base.OnPaint(eventArgs);
    }
}

NearestNeighbour, Bilinear and HighQualityBilinear interpolations, upscaling a 16x16 image to 256x256

这是一张16x16图像:the original 16x16 image,使用

升级到256x256
  • NearestNeighbour(左)
  • Bilinear(默认为中间)
  • HighQualityBilinear(右)

所有内容都在InterpolatingPictureBox控件上呈现。

答案 1 :(得分:0)

你有一个严重的问题。没有简单的解决方案。

  

我想知道如何让他们不模糊

不可能。锐化(这是你想要的)图像到更大的分辨率是可能的,但这需要严重的高级程序运行一段时间。这里不是程序员 - 但这是印刷美术摄影的标准步骤。照片分辨率相对较低(我的分辨率高达4300万像素),打印机的分辨率要高得多。

有一些AA方法很容易,但10x10大小上升到100x100甚至会挑战最先进的程序 - 10x10无法使用。你说的是10x,从头开始没有数据。

您可以关闭抗锯齿功能,在没有抗锯齿的情况下在代码中调整图像大小(易于操作) - 但这会使真实图片看起来很难看。 .NET没有真正的高级锐化功能,再次,10x10还不足以开始使用。

您可以做的最好的事情就是不将它们加载到图片框中。将它们加载到位图中,然后将其绘制到最佳大小(100x100)的新位图上。这至少可以让您完全控制调整大小。

您可以在此处找到此代码 Scaling a System.Drawing.Bitmap to a given size while maintaining aspect ratio

,而

Image resizing in .Net with Antialiasing

告诉您如何选择抗锯齿。

但又一次:期待很少。这些抗锯齿模式纯粹是技术性的,而不是用于照片的任何东西。另外,选择正确的一个取决于输入图像 - 因此您可以使用默认值或给用户一个选择。我可能过于复杂,但在编程之外我实际上处理的是需要按比例放大的图像,尽可能少的图像丢失用于大型打印。