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

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top