【问题标题】:How to show an image in PictureBox if the picture can be from 10x10 to 500x500如果图片可以从 10x10 到 500x500,如何在 PictureBox 中显示图像
【发布时间】:2016-03-04 11:34:46
【问题描述】:

现在我使用下一个代码将图片从桌面下载到 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),它看起来很模糊。

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

小图的等待结果应该是这样的

普通图片的等待结果应该是这样的

【问题讨论】:

  • 尝试将图片框大小更改为图像大小。如果你的图片被拉伸太多,它会看起来像这样。
  • 它是模糊的,因为它正在抗锯齿。没有足够的图像数据来填充 100x100 的正方形,因此系统试图通过在可用像素上平滑图像来“填充空白”。没有真正的解决方案,您可以将图像设置为实际大小,在这种情况下不会发生缩放
  • PictureBox 在重新缩放图像以适应控件时,始终使用 Graphics.InterpolationMode 的“体面”值。您喜欢低质量的 InterpolationMode.NearestNeighbor。只需自己调整图像大小。

标签: c# image picturebox


【解决方案1】:

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

谢天谢地,.NET 内置了这个。您可以将插值模式设置为 GDI Graphics 对象,该对象呈现您的 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);
    }
}

这是一张 16x16 的图片:,使用放大到 256x256

  • NearestNeighbour(左)
  • Bilinear(默认,中间)
  • HighQualityBilinear(右)

所有都呈现在InterpolatingPictureBox 控件上。

【讨论】:

  • 这是我回答中所说的“蹩脚”抗锯齿的一个很好的例子。将其与例如 QImage 所做的插值(这是一种用于准备打印图像的软件)进行比较,您会惊讶于它们看起来有多糟糕。问题是:这些模式从来都不是为 10:1 的尺寸增加而设计的。
  • 您的图片没有达到应有的代表性。文本渲染器使用的抗锯齿像素是可见的,这是 TomTom 错误地抱怨的。您必须从使用 TextRenderingHint.SingleBitPerPixelGridFit 渲染的 16x16 A 开始,以匹配 OP 的场景。
  • @HansPassant 你说得对,我更新了我的图片不包括抗锯齿
  • 你明白了,干得好。太糟糕了,选择了错误的答案,无法帮助您。
【解决方案2】:

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

我想知道如何让它们变得模糊

不可能。在合理的范围内可以将图像锐化(这是您想要的)更大的分辨率,但这需要运行相当长一段时间的高级程序。这里不是作为程序员说话 - 但这是印刷美术摄影的标准步骤。照片的分辨率相对较低(我的分辨率高达 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

告诉你如何选择抗锯齿。

但同样:期望很少。这些抗锯齿模式纯粹是技术性的,而不是您用于照片的任何东西。另外,选择正确的图像取决于输入图像 - 因此您可以使用默认值或给用户一个选择。我可能把事情复杂化了,但在编程之外,我实际上确实处理需要放大的图像,并且尽可能减少图像损失以进行大型打印。

【讨论】:

  • 这是不正确的。放大时抗锯齿不会增加模糊性,放大时甚至不使用抗锯齿。抗锯齿仅在创建原始小图像时使用,这甚至不是 OP 所要求的,因为您可以看到他的示例没有抗锯齿。
  • 你真的不知道你在说什么。我建议你去访问 qimage 网站,看看如何正确升级。
  • 我完全不知道你在说什么,OP 明确要求说他希望文本看起来块状(或“像砖块”)。这与抗锯齿的作用完全相反——它“平滑”线条,去除块状边缘。你可以阅读它here,只需向下滚动到关于抗锯齿的部分。移除(或者更确切地说,使用最基本的最近邻)插值解决了模糊性问题,这就是整个问题的意义所在。
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多