Запись изображения в Java с цветовым пространством CMYK
но я не смог найти хороший пример, который мог бы помочь отредактировать метаданные до желаемого разрешения (в моем случае 600 DPI). ). Пожалуйста, помогите, если у вас есть идеи. Заранее спасибо
Код: Выделить всё
package com.optum.idcard.library.print;
import com.twelvemonkeys.imageio.color.ColorSpaces;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.io.File;
import java.io.IOException;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
public class IdCardPrinterCMYK1 {
private static final int CARD_WIDTH = 1011;
private static final int CARD_HEIGHT = 627;
private BufferedImage idCardImage;
private Graphics2D graphics;
static ColorSpace cmykCS = ColorSpaces.getColorSpace(ColorSpaces.CS_GENERIC_CMYK);
public IdCardPrinterCMYK1() {
ColorModel colorModel = new ComponentColorModel(cmykCS, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
idCardImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(CARD_WIDTH, CARD_HEIGHT), colorModel.isAlphaPremultiplied(), null);
graphics = idCardImage.createGraphics();
graphics.setBackground(Color.WHITE);
graphics.fillRect(0, 0, CARD_WIDTH, CARD_HEIGHT);
}
public void drawText(String text, int x, int y, String fontName, int fontSize, int fontWeight, Color color) {
Font font = new Font(fontName, fontWeight, fontSize);
graphics.setFont(font);
graphics.setColor(color);
graphics.drawString(text, x, y);
}
public void saveIdCard(String filePath) throws IOException {
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1.0f);
ImageIO.write(idCardImage, "jpg", new File(filePath));
}
public void setDpiUsingTwelveMonkeys(String filePath) throws IOException {
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
// Create output file and ImageOutputStream
File outputFile = new File(filePath);
ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(ios);
// Create and set the metadata
IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(idCardImage), null);
IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree("javax_imageio_jpeg_image_1.0");
IIOMetadataNode jfif = (IIOMetadataNode) root.getElementsByTagName("app14Adobe").item(0);
// I understand CMYK app14 marker accepts only few set of params. That's why commented these lines out
// jfif.setAttribute("Xdensity", "300");
// jfif.setAttribute("Ydensity", "300");
// jfif.setAttribute("resUnits", "1"); // 1 means dots per inch
jfif.removeAttribute("flags0");
jfif.removeAttribute("flags1");
jfif.removeAttribute("version");
metadata.setFromTree("javax_imageio_jpeg_image_1.0", root);
// Write the image with the new metadata
writer.write(metadata, new IIOImage(idCardImage, null, metadata), null);
// Cleanup
ios.close();
writer.dispose();
}
public static void main(String[] args) {
IdCardPrinterCMYK1 printer = new IdCardPrinterCMYK1(); // Example usage:
try { // Draw text
printer.drawText("JOHN DOE", 170, 100, "Arial", 20, Font.BOLD, Color.BLACK); // Draw image
printer.drawText("123456789", 170, 130, "Arial", 20, Font.BOLD, Color.BLACK);
printer.drawText("ABC:", 50, 100, "Arial", 15, Font.BOLD, new Color(cmykCS, new float[] {1, 0, 0, 0}, 1.0f)); // Draw image
printer.drawText("DEF:", 50, 130, "Arial", 15, Font.BOLD, Color.BLUE);
printer.saveIdCard("src/main/resources/card.jpg");
printer.setDpiUsingTwelveMonkeys("src/main/resources/card.jpg");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... s-per-inch