import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.awt.image.Raster;
+import java.io.IOException;
+import java.util.Arrays;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log;
+ " The image may not be handled correctly." + " Base color space: "
+ icm.getColorSpace() + " Image: " + image.getInfo());
}
- indexed.add(new PDFName(toPDFColorSpace(icm.getColorSpace()).getName()));
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
int c = icm.getMapSize();
int hival = c - 1;
if (hival > MAX_HIVAL) {
throw new UnsupportedOperationException("hival must not go beyond " + MAX_HIVAL);
}
- indexed.add(Integer.valueOf(hival));
+ boolean isDeviceGray = false;
int[] palette = new int[c];
icm.getRGBs(palette);
- ByteArrayOutputStream baout = new ByteArrayOutputStream();
- for (int i = 0; i < c; i++) {
- // TODO Probably doesn't work for non RGB based color spaces
- // See log warning above
- int entry = palette[i];
- baout.write((entry & 0xFF0000) >> 16);
- baout.write((entry & 0xFF00) >> 8);
- baout.write(entry & 0xFF);
+ byte[] reds = new byte[c];
+ byte[] greens = new byte[c];
+ byte[] blues = new byte[c];
+ icm.getReds(reds);
+ icm.getGreens(greens);
+ icm.getBlues(blues);
+ isDeviceGray = Arrays.equals(reds, blues) && Arrays.equals(blues, greens);
+ if (isDeviceGray) {
+ indexed.add(new PDFName("DeviceGray"));
+ try {
+ baout.write(blues);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } else {
+ indexed.add(new PDFName(toPDFColorSpace(icm.getColorSpace()).getName()));
+ for (int i = 0; i < c; i++) {
+ int entry = palette[i];
+ baout.write((entry & 0xFF0000) >> 16);
+ baout.write((entry & 0xFF00) >> 8);
+ baout.write(entry & 0xFF);
+ }
}
+ indexed.add(hival);
+
indexed.add(baout.toByteArray());
dict.put("ColorSpace", indexed);