如何为 P6 ppm 编码 RGB 值?

How to encode RGB values for a P6 ppm?

我正在尝试使用 P6 编码创建 ppm 图像文件。我正在使用此代码创建文件:

private static void writeImage(String image, String outputPath) {
    try (PrintWriter out = new PrintWriter(outputPath + "output.pbm")) {
        out.println(image);
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }
}

现在我需要做的就是构建代表 P6 格式图像的文本。构建 header 很容易,但尽管进行了试验和搜索,我似乎无法弄清楚如何将每个像素的 RGB 值转换为可以添加到文件中的字符串。

我的问题是:

如何获取 RGB 值(例如(red=255, blue=192, green=0))并获得可在 P6 格式的图像中正确识别的字符串表示形式?


解法: 感谢 Solomon Slow 的评论帮助我解决了这个问题。这是我为那些想要详细信息的人提出的解决方案。我现在使用这个函数来创建和输出文件:

private static void writeImage(String header, List<Byte> image, String filepath) {
    try (FileOutputStream out = new FileOutputStream(filepath)) {
        out.write(header.getBytes(StandardCharsets.UTF_8));
        for(byte b:image) {
            out.write(b);
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
        throw new TerminateProgram();
    }
}

我传入的header在另一个函数中是这样定义的:

String header = "P6" + "\n" +
                width + " " +
                height + "\n" +
                "255" + "\n";

最后,我使用 ArrayList 构建一个字节值列表,像这样添加每个像素:

List<Byte> image = new ArrayList<>();

// red, green, blue already defined as ints from 0 to 255
image.add((byte)(red));
image.add((byte)(green));
image.add((byte)(blue));

来自,http://netpbm.sourceforge.net/doc/ppm.html

Each pixel is a triplet of red, green, and blue samples, in that order. Each sample is represented in pure binary by either 1 or 2 bytes. The most significant byte is first.

也就是说,ppm 文件不是文本文件。您可能应该使用 FileOutputStream 而不是 PrintWriter.

这会有点棘手,因为 Java 的 byte 数据类型已签名。对于红色、绿色和蓝色级别,您需要在 [0..255] 范围内设置 int 值,然后将它们转换为 byte。也许看到 java unsigned byte to stream

至于文件的文本 header,我将使用的方法是 build a String representation of the header, and then call header.getBytes() 将其转换为 byte 数组,您可以将其写入 FileOutputStream.