Wie schreibe ich PNG-Dateien in Java mit den Pixel-RGB-Werten 0 bis 1?
-
27-10-2019 - |
Frage
Ich schreibe einen Ray Tracer in Java und versuche herauszufinden, wie ich mein generiertes Bild in eine PNG-Datei schreibe.Bisher zeigen alle Beispiele, die ich gefunden habe, die Verwendung von BufferedImage zum Erstellen eines PNG, aber alle verwenden RGB-Werte von 0 bis 255. In meinem Code stelle ich jeden Pixelfarbwert zwischen 0 und 1 dar, also ist beispielsweise Magenta (1), 0, 1).Wie kann ich ein PNG mit solchen Werten schreiben?
Danke
Lösung
Wenn Sie Ihren Wert zwischen 0 und 1 mit 255 multiplizieren, erhalten Sie eine Zahl zwischen 0 und 255.
Hinweis: Das Schreiben eines BufferedImage
s in eine PNG-Datei ist mit der ImageIO-API sehr einfach. Es ist nur eine Codezeile:
import javax.imageio.ImageIO;
// ...
BufferedImage image = ...;
ImageIO.write(image, "png", new File("output.png"));
Andere Tipps
Sie können einen benutzerdefinierten BufferedImage
erstellen, in dem die Pixeldaten als float[]
gespeichert werden.
Ich empfehle es jedoch nicht, da einige der Plattform-API-Funktionen die Farbraumkonvertierung falsch durchführen, wenn dies nicht erforderlich ist (z. B. wenn Quelle und Ziel beide sRGB sind).
Beispiel:
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);