Как конвертировать TIFF в JPEG/PNG в Java
Недавно я столкнулся с проблемой при попытке отобразить файл изображения. К сожалению, формат изображения - это формат TIFF, который не поддерживается основным веб-браузером (поскольку я знаю, что только Safari поддерживает этот формат). Из-за определенных ограничений, я должен преобразовать этот формат в другой формат, который поддерживается основным браузером. Тем не менее, это приносит мне много проблем, когда я пытаюсь конвертировать формат.
У меня был поиск по сети, и хотя в этой ссылке была опубликована похожая проблема Как мне преобразовать TIF в PNG на Java?"но я не могу иметь результат, как он предложил..
Поэтому я снова поднимаю этот вопрос, чтобы пожелать лучшего объяснения и руководства от всех вас..
Было несколько проблем, с которыми я столкнулся во время прохождения предложенного решения:
1) Согласно ответу, предложенному Джонатаном Фейнбергом, необходимо установить JAI и JAI/ImageIO. Однако после того, как я установил их оба, я все еще не мог импортировать файл в Netbean 7.2. NETBean 7.2 остается предложить импортировать библиотеку imageIO по умолчанию.
2) когда я использую метод чтения библиотеки ImageIO по умолчанию, он вернет значение NULL, и я не смогу продолжить.
3) Я также попробовал другой метод, такой как преобразование файла TIFF в файл BIN с использованием метода BufferedOutputStream, но размер файла результата превышает 11 МБ, что слишком велико для загрузки, и в итоге загрузка не удалась.
if (this.selectedDO != null) {
String tempDO = this.selectedDO.DONo;
String inPath = "J:\\" + tempDO + ".TIF";
String otPath = "J:\\" + tempDO + ".bin";
File opFile = new File(otPath);
File inFile = new File(inPath);
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(new FileInputStream(inPath), DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(new FileOutputStream(otPath), DEFAULT_BUFFER_SIZE);
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
try {
output.flush();
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Следовательно, надеюсь, что вы можете получить помощь и совет от всех вас, чтобы я мог преобразовать формат TIFF в другой формат, такой как JPEG/PNG.
5 ответов
Пройдя некоторое исследование и тестирование, нашел способ конвертировать TIFF в JPEG и извините за ожидание, так долго только загружал этот ответ.
SeekableStream s = new FileSeekableStream(inFile);
TIFFDecodeParam param = null;
ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
RenderedImage op = dec.decodeAsRenderedImage(0);
FileOutputStream fos = new FileOutputStream(otPath);
JPEGEncodeParam jpgparam = new JPEGEncodeParam();
jpgparam.setQuality(67);
ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam);
en.encode(op);
fos.flush();
fos.close();
p / s: otPath означает путь, по которому вы хотите сохранить свое изображение JPEG. Например: "C:/image/abc.JPG"; inFile - это входной файл, который является файлом TIFF.
По крайней мере, этот метод работает для меня. Если есть какой-либо другой лучший метод, пожалуйста, поделитесь с нами.
Спасибо и С уважением,
Добавить зависимость
<dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.3.1</version> </dependency>
https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core
https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core/1.3.1
кодирование
final BufferedImage tif = ImageIO.read(new File("test.tif")); ImageIO.write(tif, "png", new File("test.png"));
На многих страницах работает следующее:
добавить зависимость:
<dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-core</artifactId> <version>1.4.0</version> </dependency>
используйте следующий код Java8
public void convertTiffToPng(File file) { try { try (InputStream is = new FileInputStream(file)) { try (ImageInputStream imageInputStream = ImageIO.createImageInputStream(is)) { Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInputStream); if (iterator == null || !iterator.hasNext()) { throw new RuntimeException("Image file format not supported by ImageIO: " + file.getAbsolutePath()); } // We are just looking for the first reader compatible: ImageReader reader = iterator.next(); reader.setInput(imageInputStream); int numPage = reader.getNumImages(true); // it uses to put new png files, close to original example n0_.tiff will be in /png/n0_0.png String name = FilenameUtils.getBaseName(file.getAbsolutePath()); String parentFolder = file.getParentFile().getAbsolutePath(); IntStream.range(0, numPage).forEach(v -> { try { final BufferedImage tiff = reader.read(v); ImageIO.write(tiff, "png", new File(parentFolder + "/png/" + name + v + ".png")); } catch (IOException e) { e.printStackTrace(); } }); } } } catch (IOException e) { e.printStackTrace(); } }
Вы можете попробовать эту замечательную библиотеку Java на Github, которая предоставляет множество утилит для обработки, открытия и записи файлов.tiff.
Простой пример из этого Git показывает, как конвертировать TIFF в JPEG:
TiffConverter.ConverterOptions options = new TiffConverter.ConverterOptions();
//Set to true if you want use java exception mechanism
options.throwExceptions = false;
//Available 128Mb for work
options.availableMemory = 128 * 1024 * 1024;
//Number of tiff directory to convert;
options.readTiffDirectory = 1;
//Convert to JPEG
TiffConverter.convertTiffJpg("in.tif", "out.jpg", options, progressListener);
Во-первых, обратите внимание на то, что является лучшей библиотекой / подходом обработки изображений Java?, Для вашего кода вы можете использовать
javax.imageio.ImageIO.write(im, type, represFile);
как вы можете видеть в примере записи изображения в файл.