Я преобразовываю входной файл (PDF, TIFF) в выходной (TIFF) файл, используя PDFBox (PDF в BufferedImage) и использую двенадцать обезьян для преобразования буферизованного изображения в файл Tiff путем изменения размера с помощью Imagewriter с IIOImage. Файл конвертируется, но теряет качество изображения. А после того, как изменил тип изображения BufferedImage.TYPE_BYTE_GRAY на BufferedImage.TYPE_BYTE_BINARY, мои текстовые маркеры для файла потерялись.
Ниже приведен код, который используется. Как преобразовать изображение без потери качества?
Я конвертирую размер файла изображения 1648 * 2338 с разрешением 200 точек на дюйм, и я хотел установить интерпретацию фотометрии c на min_is_white, но не смог решить мою проблему.
File inputFile = new File(inputImagePath);
BufferedImage inputImage = ImageIO.read(inputFile);
final int imageType = BufferedImage.TYPE_BYTE_BINARY;
// creates output image
BufferedImage outputImage = new BufferedImage(scaledWidth, scaledHeight,imageType);
// scales the input image to the output image
Graphics2D g2d = outputImage.createGraphics();
g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
g2d.dispose();
// writes to output file
final List<Entry> entries =new ArrayList<Entry>();
entries.add(new TIFFEntry(TIFF.TAG_X_RESOLUTION, new Rational(200)));
entries.add(new TIFFEntry(TIFF.TAG_Y_RESOLUTION, new Rational(200)));
entries.add(new TIFFEntry(TIFF.TAG_PHOTOMETRIC_INTERPRETATION, TIFF.TYPE_SHORT, 0));
final IIOMetadata tiffImageMetadata =new TIFFImageMetadata(entries);
ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next();
FileImageOutputStream fio = new FileImageOutputStream(new File(outputImagePath));
ImageWriteParam params = writer.getDefaultWriteParam();
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
fio.setByteOrder(ByteOrder.LITTLE_ENDIAN);
IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(outputImage), params);
writer.setOutput(fio);
IIOImage iioimage = new IIOImage(outputImage, null, tiffImageMetadata);
writer.write(null, iioimage, params);
fio.close();
writer.dispose();