Одинаковые пути отображаются в разные размеры, когда их цвета инвертированы? - PullRequest
1 голос
/ 09 марта 2012

Ну, я рендерил один и тот же путь 2 раза один раз с белой кистью на черном фоне и один с черной кистью на белом фоне.

Теперь результат должен быть таким же, но инвертированным, верно?

Неправильно, тот, который нарисован на черном фоне, на несколько пикселей больше ..

enter image description here enter image description here

Diff

enter image description here

Код, который я использовал, чтобы нарисовать эти

PointF[] points = LoadXml<PointF[]>(@"T:\Points.xml");
byte[] types = LoadXml<byte[]>(@"T:\Types.xml");
GraphicsPath path = new GraphicsPath(points, types, FillMode.Alternate);
using (Image image = new Bitmap(45, 45))
{
    using (Graphics g = Graphics.FromImage(image))
    {
        Render(g, Color.White, Color.Black, path);
    }
    image.Save(@"T:\White.bmp", ImageFormat.Bmp);
}
using (Image image = new Bitmap(45, 45))
{
    using (Graphics g = Graphics.FromImage(image))
    {
        Render(g, Color.Black, Color.White, path);
    }
    image.Save(@"T:\Black.bmp", ImageFormat.Bmp);
}

private static T LoadXml<T>(string file)
{
    System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
    using (Stream stream = File.OpenRead(file))
    {
        return (T)xmlSerializer.Deserialize(stream);
    }
}

private static void Render(Graphics g, Color mainColor, Color backColor, GraphicsPath graphicsPath)
{
    g.CompositingQuality = CompositingQuality.HighQuality;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.InterpolationMode = InterpolationMode.HighQualityBilinear;

    g.Clear(backColor);
    using (SolidBrush mainBrush = new SolidBrush(mainColor))
    {
        g.FillPath(mainBrush, graphicsPath);
    }
}

Есть ли способ заставить их отображаться одинаково без изменения пути?

1 Ответ

2 голосов
/ 10 марта 2012

По общему признанию, я только догадываюсь, но:

Это может быть результатом попытки GDI + выполнить гамма-корректный рендеринг. (Я не проверял, что это делает).

Исторически мониторы были нелинейными. Таким образом, пиксель со значением 255 в градациях серого намного более чем в два раза ярче, чем пиксель со значением 128. Итак, если вы пытаетесь сглаживать линию и хотите нарисовать пиксель, на 50% покрытый белым, пиксель со значением 128 слишком темный. Это больше похоже на 25% белого. Чтобы получить 50% белого пикселя, вы должны принять значение около 180 (я точно не помню).

Это приведет к тому, что белое изображение будет на полпикселя больше, чем черное, если вы сравните его с инверсией.

...