Судя по результатам поиска, которые я получил, на большинстве страниц предлагались изображения Apache Commons или двенадцать обезьян, но я могу создать цветовую схему CMYK TIFF и JPEG, используя изображения IO и TwelveMonkeys, расширив следующий пример, приведенный на этой странице.
Запись изображения в 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();
}
}
}
Я пытался создать желаемый DPI JPEG или TIFF, используя библиотеку TwelveMonkeys и общие возможности ввода-вывода изображений и Apache Image, но не смог найти хорошего примера.
Судя по результатам поиска, которые я получил, на большинстве страниц предлагались изображения Apache Commons или двенадцать обезьян, но я могу создать цветовую схему CMYK TIFF и JPEG, используя изображения IO и TwelveMonkeys, расширив следующий пример, приведенный на этой странице. Запись изображения в Java с цветовым пространством CMYK но я не смог найти хороший пример, который мог бы помочь отредактировать метаданные до желаемого разрешения (в моем случае 600 DPI). ). Пожалуйста, помогите, если у вас есть идеи. Заранее спасибо [code]package com.optum.idcard.library.print;
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); }
// 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);
[/code] Я пытался создать желаемый DPI JPEG или TIFF, используя библиотеку TwelveMonkeys и общие возможности ввода-вывода изображений и Apache Image, но не смог найти хорошего примера.