gpt4 book ai didi

java - 以 16 位颜色深度在 Graphics2D 中绘制时出现错误颜色

转载 作者:行者123 更新时间:2023-11-29 05:19:09 30 4
gpt4 key购买 nike

在使用旧 PC1 时,我发现了一些我认为是奇怪的渲染错误。

颜色深度设置为 16 位(32768 色)时会出现此问题。

特别是,当使用 Graphics2D 绘制具有低 alpha 值的颜色时,它会出现。下面是一个MVCE重现问题。它只是绘制几组线条,颜色为 白色,alpha 值范围为 4 到 12。运行该程序的结果如下图所示:

OddColors

可以看到,对于某些 alpha 值,某些颜色实际上是绿色的,尽管显然应该有 50 9 种灰色阴影。

(同样,它仅在颜色深度设置为 16 位时出现!)

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class _WTFPaintTest
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
createAndShowGUI();
}
});
}

private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.getContentPane().add(new JPanel()
{
@Override
protected void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D)gr;
g.setColor(Color.BLACK);
g.fillRect(0,0,getWidth(),getHeight());

for (int a=4; a<=12; a++)
{
int x = (a-3) * 50;
g.setColor(Color.WHITE);
g.drawString(String.valueOf(a), x, 25);

g.setColor(new Color(255,255,255,a));
for (int j=0; j<3; j++)
{
for (int i=0; i<50; i++)
{
g.drawLine(x,50+i,x+25,75);
}
}
}
}
});

f.setSize(550,200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}

(我将它的原名贴在这里,以强调我发现这个有多么恼人...)

这种情况下显色异常的原因是什么?


1:WinXP,32 位,NVIDIA GeForce 2 显卡

最佳答案

此行为的原因是颜色分量(红色、绿色和蓝色)在 16-bit color mode 中用不同的位数表示。 .

这 16 位在颜色分量中的分布如下:

  • 红色用5位表示
  • 绿色用6位表示
  • 蓝色用5位表示

这意味着 16 位颜色有 25 = 32 种不同的红色和蓝色,但是 26 = 64 种绿色。

(绿色接收额外的位,因为人眼对绿色阴影的敏感度高于对红色或蓝色阴影的敏感度)

现在,当标准 24 bit RGB color转换为 16 位颜色时,会发生采样错误。在 24 位颜色中,每个颜色分量有 8 位。通过获取颜色分量的最高位,将它们转换为 16 位颜色的相应分量。

在示例屏幕截图中,可以看到使用 alpha 值 7 绘制的线条。这种颜色的 RGB 表示是 (7,7,7)。这种颜色的二进制表示是 (00000111b,00000111b,00000111b)。对每个颜色分量取最高位时,结果为

  • 5 位红色:00000111b -> 00000b
  • 绿色 6 位:00000111b -> 000001b
  • 5 位蓝色:00000111b -> 00000b

因此,绿色分量是唯一具有非零值的分量。然后显示在屏幕上的实际颜色的绿色分量可以想象为 6 位绿色分量,左移 2 位:

  • 000001b << 2 = 00000100b

这可以通过检查屏幕截图中的相应像素来确认,这些像素存储为 0x000C00,或 24 位 RGB 值 (0,12,0):深绿色阴影。

关于java - 以 16 位颜色深度在 Graphics2D 中绘制时出现错误颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25473302/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com