我在黑色背景上用白色画笔一次渲染相同的路径2次,在白色背景上用黑色画笔渲染一次。
现在结果应该是相同的图像但是反转了吗?
错误的是,在黑色背景上绘制的那个更大几个像素。
DIFF
我曾用过的代码
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);
}
}
有没有办法让它们以相同的方式渲染而不修改路径?
答案 0 :(得分:2)
不可否认,我只是在猜测,但是:
这可能是GDI +尝试进行伽马校正渲染的结果。 (我没有检查它确实如此)。
历史上,显示器监视器是非线性的。因此,灰度值为255的像素的亮度远远超过值为128的像素的两倍。因此,如果您尝试对一条线进行反锯齿,并且想要绘制一个50%覆盖白色的像素,值为128的像素太暗。它更像是25%的白色。要获得50%的白色像素,您应该采用大约180的值(我不记得确切)。
如果将白色图像与反色图像进行比较,这将导致白色图像比黑色图像大半个像素。