Пишите в формате JPEG или TIFF, используя Java с цветовой схемой CMYK и разрешением 600 DPI (точек на дюйм).JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пишите в формате JPEG или TIFF, используя Java с цветовой схемой CMYK и разрешением 600 DPI (точек на дюйм).

Сообщение Anonymous »

Судя по результатам поиска, которые я получил, на большинстве страниц предлагались изображения 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, но не смог найти хорошего примера.

Подробнее здесь: https://stackoverflow.com/questions/787 ... s-per-inch
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»