如何为 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
.
我正在尝试使用 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
.