【问题标题】:Why I can not draw pixel side by side pixel?为什么我不能并排绘制像素?
【发布时间】:2015-10-20 17:28:15
【问题描述】:

我想在 C# 中使用 Canvas 绘制图片。 我必须控制图片每个像素的颜色,所以我使用矩形来绘制它。

public void AddPixel(Canvas canvas, double x, double y)
    {
        Rectangle rec = new Rectangle();
        Canvas.SetTop(rec, y);
        Canvas.SetLeft(rec, x);
        rec.Width = 1;
        rec.Height = 1;
        rec.Fill = new SolidColorBrush(Colors.Black);
        canvas.Children.Add(rec);
    }

它应该可以工作,但是当我想检查它并简单地绘制黑色图片时:

for (int y = 0; y < 50; y++)
        {
            for (int x = 0; x < 50; x++)
            {
                AddPixel(MandelbrotCanvas, x, y);
            }
        }

我得到这样的东西 - 带有边框的矩形,像素之间的空间:

为什么?谁能帮我画一张清晰的黑色图片?

【问题讨论】:

  • 也许这与将5 而不是y 传递给AddPixel 方法有关?
  • 我复制了错误的代码。我在使用 AddPixel(..., x, y) 时得到的这张图片
  • 尝试添加这个:rec.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);。如果这不起作用,请尝试添加 rec.SnapsToDevicePixels = true;
  • 是的!对我有帮助,非常感谢!你能把它写成答案吗?
  • 如果您正在制作逐像素绘图,我还建议您使用WriteableBitmap。在当前状态下,您的方法(使用 Rectangles 制作每像素绘图)可能会受到性能不佳的影响,因为您每次绘制框架时都会创建和处理 2500 个 UI 元素。

标签: c# wpf canvas drawing pixel


【解决方案1】:

您的图像显示似乎存在某种程度的supersampling(一种空间抗锯齿方法)。你的 1px 宽的线条变得比实际更柔软。抗锯齿有助于绘制看起来不“像素化”的斜线。

超采样线(放大):

别名线:

设置RenderOptions.EdgeModeProperty 以确保您的矩形没有抗锯齿:

rec.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);

如果这不起作用,请尝试添加设置 UIElement.SnapsToDevicePixels 属性:

rec.SnapsToDevicePixels = true;

我想这会阻止subpixel rendering 的矩形。

【讨论】:

    【解决方案2】:

    这个对我有帮助

    rec.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2023-03-03
      • 2013-03-28
      • 2016-07-12
      • 2015-09-20
      相关资源
      最近更新 更多