Como escrever arquivos PNG em java usando valores RGB de pixel 0 a 1?
-
27-10-2019 - |
Pergunta
Estou escrevendo um ray tracer em java e tentando descobrir como gravar minha imagem gerada em um arquivo PNG.Até agora, todos os exemplos que encontrei demonstram o uso de BufferedImage para criar um PNG, mas todos usam valores RGB de 0 a 255. Em meu código, represento cada valor de cor de pixel entre 0 e 1, por exemplo, magenta é (1, 0, 1).Como posso escrever um PNG com esses valores?
Obrigado
Solução
Se você multiplicar seu valor entre 0 e 1 por 255, obterá um número entre 0 e 255.
Observação: escrever um BufferedImage
em um arquivo PNG é muito fácil com a API ImageIO, é apenas uma linha de código:
import javax.imageio.ImageIO;
// ...
BufferedImage image = ...;
ImageIO.write(image, "png", new File("output.png"));
Outras dicas
Você pode criar um BufferedImage
personalizado que armazena seus dados de pixel como um float[]
.
No entanto, não o recomendo, porque algumas das funções da API da plataforma executam incorretamente a conversão do espaço de cores quando não é necessário (por exemplo, quando a origem e o destino são sRGB).
Exemplo:
ColorModel cm =
new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
false, false, Transparency.OPAQUE,
DataBuffer.TYPE_FLOAT);
WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
BufferedImage img = new BufferedImage(cm, raster, false, null);