Skip to content

Instantly share code, notes, and snippets.

@claudenobs
Last active July 27, 2017 18:48
Show Gist options
  • Save claudenobs/6c9e6693ac9cc44ddb8c0c48bad0bebd to your computer and use it in GitHub Desktop.
Save claudenobs/6c9e6693ac9cc44ddb8c0c48bad0bebd to your computer and use it in GitHub Desktop.
TwelveMonkeysCmykJpgWriter
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageWriter;
public final class TwelveMonkeysCmykJpgWriter {
/**
* @param image f.ex. rgb jpg read with ImageIO.read(path.toFile())
*/
public PDImageXObject convert(PDDocument document, BufferedImage image) {
String name = "org/apache/pdfbox/resources/icc/ISOcoated_v2_300_bas.icc";
URL url = PDDeviceCMYK.class.getClassLoader().getResource(name);
ICC_ColorSpace iccColorSpace = new ICC_ColorSpace(ICC_Profile.getInstance(url.openStream()));
ColorConvertOp op = new ColorConvertOp(c.getColorModel().getColorSpace(), iccColorSpace, null);
image = op.filter(image, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
writeCmyk(baos, image);
byte[] bytes = baos.toByteArray();
return new PDImageXObject(document, new ByteArrayInputStream(bytes), COSName.DCT_DECODE, //
image.getWidth(), image.getHeight(), image.getColorModel().getComponentSize(0), PDDeviceCMYK.INSTANCE);
}
public void write(OutputStream os, BufferedImage image) throws IOException {
ImageWriter writer = writer("jpg");
try (ImageOutputStream output = ImageIO.createImageOutputStream(os)) {
writer.setOutput(output);
// Optionally, listen to progress, warnings, etc.
ImageWriteParam param = writer.getDefaultWriteParam();
// Optionally, control format specific settings of param (requires casting), or
// control generic write settings like sub sampling, source region, output type etc.
// Optionally, provide thumbnails and image/stream metadata
// writer.write(..., new IIOImage(..., image, ...), param);
writer.prepareWriteSequence(null);
writer.writeToSequence(new IIOImage(image.getRaster(), null, null), param);
} finally {
writer.dispose(); // Dispose writer in finally block to avoid memory leaks
}
}
private ImageWriter writer(String format) {
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(format);
while (writers.hasNext()) {
ImageWriter w = writers.next();
if (w instanceof JPEGImageWriter) {
return w;
}
}
throw new IllegalArgumentException("No writer for: " + format);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment