当颜色反转时,相同的路径会呈现不同的大小吗?

时间:2012-03-09 19:37:06

标签: .net gdi+

我在黑色背景上用白色画笔一次渲染相同的路径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 个答案:

答案 0 :(得分:2)

不可否认,我只是在猜测,但是:

这可能是GDI +尝试进行伽马校正渲染的结果。 (我没有检查它确实如此)。

历史上,显示器监视器是非线性的。因此,灰度值为255的像素的亮度远远超过值为128的像素的两倍。因此,如果您尝试对一条线进行反锯齿,并且想要绘制一个50%覆盖白色的像素,值为128的像素太暗。它更像是25%的白色。要获得50%的白色像素,您应该采用大约180的值(我不记得确切)。

如果将白色图像与反色图像进行比较,这将导致白色图像比黑色图像大半个像素。