【问题标题】:How do I position lines exactly in C#如何在 C# 中准确定位行
【发布时间】:2015-06-09 06:14:15
【问题描述】:

我确实希望系统尝试缩放我的绘图,我想完全由我自己完成,因为任何挤压/拉伸图形的尝试都会产生丑陋的结果。问题是随着图像变大,我想添加更多细节,而不是简单地放大。

现在我正在查看两组条纹。一种是黑/白,另一种是黑/白/白。笔宽设置为 1。

当线条水平绘制时,它是正确的。绘制垂直线的相同逻辑似乎正在做一些抗锯齿,将黑色渗透到附近的白色上。黑/白/白看起来不如横版,黑/白看起来更像中++灰/中--灰。

相同的代码在所有情况下都生成坐标,转换逻辑只是选择要应用的偏移量,因为我只支持基数上的方向。由于不涉及浮点数,因此我无法查看精度问题。

如何让系统不理会我的图形???

(是的,我意识到这不适用于高分辨率,最终我将不得不放大线条。在任何合理的屏幕缩放系数上,这都无关紧要,对于打印机使用,我将拥有玩它,看看我需要在哪里缩放。基本问题是我试图把东西塞进太少的像素,而不仅仅是制作斑点。)

编辑:没有进行缩放。我正在生成目标窗口的确切大小的位图。所有线都在整数坐标处绘制。将 SmoothingMode 设置为 None 的建议改变了这种情况:现在黑色/白色/白色绘制为非常清晰的灰色/灰色/白色,黑色/白色绘制为纯灰色框。现在已经清理干净了,我可以看到一些本来应该是黑色的单独垂直线实际上正在做与 2 像素灰色条相同的绘制操作。就像我所有的垂直线都偏离了 1/2 像素——但每个绘图命令都只得到整数。

再次编辑:我已经了解了有关该问题的更多信息。图像被正确绘制,但在显示到屏幕时被丢弃。 (将其保存到磁盘并在同一台显示器上查看显示它绘制正确。)

【问题讨论】:

    标签: c# graphics


    【解决方案1】:

    您确实应该让系统为您管理它。您已经描述了特定于您正在使用的硬件的特定行为。给定不同的硬件,问题可能根本不存在,或者可能水平存在但垂直不存在,或者可能仅存在于更小或更大的分辨率等。

    您描述的基本问题听起来像是在“垂直”像素堆栈“之间”绘制垂直线,这导致系统绘制抗锯齿线。抗锯齿线的替代方法是移动它。这样做的问题是,如果图像以任何其他方式移动、动画、缩放或变换,线条会“抖动”或“抖动”。一般来说,混蛋比抗锯齿更不受欢迎,因为它更分散注意力。

    您应该能够使用SmoothingMode 枚举关闭抗锯齿,或者您可以尝试自己处理定位。无论哪种方式,在任何移动或转换过程中,您都在用抗锯齿来换取抖动、生涩的渲染。

    【讨论】:

    • 让系统替我处理是什么意思?我认为它不可能 - 随着图像变大,我正在尝试添加更多细节。当瓷砖很小时,图纸非常粗糙,但尝试做任何更详细的事情只会造成斑点。
    • 我假设您在 .NET 中使用 GDI+。使用 GDI+(如果您愿意使用更现代的框架,还可以使用 WPF),您可以使用转换。您可以像绘制矢量图像一样绘制图像,并使用变换对其进行缩放、旋转、倾斜和移动。从那时起,系统将为您处理所有事情,您需要做的就是应用适当的转换以在您的视口中显示您尝试绘制的图像或其中的一部分。
    【解决方案2】:

    看看System.Drawing.Drawing2d.SmoothingMode。将其设置为“默认”或“无”应在进行线条绘制时关闭抗锯齿。如果您正在谈论在没有抗锯齿效果的情况下缩放图像,请查看InterpolationMode。具体来说,您可能希望将其设置为“最近邻”,这将使您的矩形块完全清晰。请注意,如果您按整数以外的任何值缩放图像,您看到一些奇怪的效果。

    【讨论】:

      【解决方案3】:

      也许您需要在半像素坐标上对齐线条?在x = 5 处绘制的一条像素线将绘制在线的中心,这意味着它将从x = 4.5 变为x = 5.5。如果您希望它从x = 4 变为x = 5,则需要将其坐标设置为x = 4.5

      GDI+ 有一个属性:http://msdn.microsoft.com/en-us/library/system.drawing.graphics.pixeloffsetmode.aspx,允许您控制此行为。

      【讨论】:

        【解决方案4】:

        听起来您需要更改应用程序以告诉系统它可以识别 DPI,因此不会发生缩放。这是一篇关于这样做的文章:http://msdn.microsoft.com/en-us/library/ms701681%28VS.85%29.aspx

        【讨论】:

        • 导入 user32.dll 因此是不可移植的。不完全是一个好的解决方案。
        • 自动缩放问题是 Windows 特有的,因此非便携式解决方案应该是可以接受的。
        猜你喜欢
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 2015-03-27
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        相关资源
        最近更新 更多