1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.formats.pnm;
18
19 import java.awt.image.BufferedImage;
20 import java.io.IOException;
21 import java.io.OutputStream;
22 import java.nio.charset.StandardCharsets;
23
24 import org.apache.commons.imaging.ImagingException;
25
26 final class PgmWriter implements PnmWriter {
27
28 private final boolean rawBits;
29
30 PgmWriter(final boolean rawBits) {
31 this.rawBits = rawBits;
32 }
33
34 @Override
35 public void writeImage(final BufferedImage src, final OutputStream os, final PnmImagingParameters params) throws ImagingException, IOException {
36
37
38 os.write(0x50);
39 os.write(rawBits ? 0x35 : 0x32);
40 os.write(PnmConstants.PNM_SEPARATOR);
41
42 final int width = src.getWidth();
43 final int height = src.getHeight();
44
45 os.write(Integer.toString(width).getBytes(StandardCharsets.US_ASCII));
46 os.write(PnmConstants.PNM_SEPARATOR);
47
48 os.write(Integer.toString(height).getBytes(StandardCharsets.US_ASCII));
49 os.write(PnmConstants.PNM_SEPARATOR);
50
51 os.write(Integer.toString(255).getBytes(StandardCharsets.US_ASCII));
52 os.write(PnmConstants.PNM_NEWLINE);
53
54 for (int y = 0; y < height; y++) {
55 for (int x = 0; x < width; x++) {
56 final int argb = src.getRGB(x, y);
57 final int red = 0xff & argb >> 16;
58 final int green = 0xff & argb >> 8;
59 final int blue = 0xff & argb >> 0;
60 final int sample = (red + green + blue) / 3;
61
62 if (rawBits) {
63 os.write((byte) sample);
64 } else {
65 os.write(Integer.toString(sample).getBytes(StandardCharsets.US_ASCII));
66 os.write(PnmConstants.PNM_SEPARATOR);
67 }
68 }
69 }
70 }
71
72 }