Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何准确地在C中定位行#_C#_Graphics - Fatal编程技术网

C# 如何准确地在C中定位行#

C# 如何准确地在C中定位行#,c#,graphics,C#,Graphics,我不希望系统试图缩放我的图形,我想完全靠我自己来做,因为任何挤压/拉伸图形的尝试都会产生难看的结果。问题是,随着图像变大,我想添加更多细节,而不是简单地放大 现在我在看两组条纹。一个是黑/白,另一个是黑/白/白。笔宽设置为1 当水平画这条线时,它是正确的。同样的逻辑绘制垂直线似乎正在进行一些抗锯齿处理,将黑色出血到附近的白色上。黑色/白色/白色看起来不如水平线,黑色/白色看起来更像中+灰色/中-灰色 相同的代码在所有情况下都生成坐标,转换逻辑只是选择要应用的偏移量,因为我只支持基数上的方向。因为

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

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

当水平画这条线时,它是正确的。同样的逻辑绘制垂直线似乎正在进行一些抗锯齿处理,将黑色出血到附近的白色上。黑色/白色/白色看起来不如水平线,黑色/白色看起来更像中+灰色/中-灰色

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

我如何让系统不去管我的图形

(是的,我意识到这在非常高的分辨率下不起作用,最终我将不得不放大线条。在任何合理的屏幕缩放因子上,这都无关紧要,对于打印机的使用,我将不得不使用它,看看我需要在何处进行缩放。基本问题是,我试图将东西压缩到太少的像素,而不只是制作斑点。)

编辑:没有进行缩放。我正在生成一个目标窗口大小的位图。所有直线均以整数坐标绘制。建议将SmoothingMode设置为“无”会改变这种情况:现在黑/白/白绘制为非常清晰的灰色/灰色/白色,而黑/白绘制为实心灰色框。现在,这是清理,我可以看到一些单独的垂直线,应该是黑色的,实际上是做同样的事情,作为2像素的灰色条绘制。这就像我所有的垂直线都减少了1/2像素——但每个绘图命令只得到整数


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

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

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

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


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

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


GDI+有一个属性:允许您控制此行为。

听起来您需要更改应用程序,告诉系统它是DPI感知的,这样就不会发生缩放。这里有一篇关于这样做的文章:

让系统为我处理这件事是什么意思?我看不出有什么办法——随着图像变大,我试图添加更多细节。当瓷砖很小时,图纸非常粗糙,但尝试做任何更详细的事情只会造成一个斑点。我假设您在.NET中使用GDI+。有了GDI+(如果您愿意使用更现代的框架,还可以使用WPF),您就可以使用转换。您可以像绘制矢量图像一样绘制图像,并使用变换对其进行缩放、旋转、倾斜和移动。从那时起,系统将为您处理一切,您需要做的只是应用适当的转换,在视口中显示您试图绘制的图像或其一部分。这将导入user32.dll,因此不可移植。这不是一个很好的解决方案。自动缩放问题是Windows特有的,因此不可移植的解决方案应该是可以接受的。