Как конвертировать 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.
Ответы
Ответ 1
Прошел некоторое исследование и тестирование, нашел способ конвертировать 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
По крайней мере, этот метод применим ко мне. Если есть другой лучший метод, любезно поделитесь с нами.
Спасибо и с уважением,
Ответ 2
-
Добавить зависимость
<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"));
Ответ 3
На многих страницах работает следующее:
-
добавить зависимость:
<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();
}
}
Ответ 4
Во-первых, посмотрите Какая лучшая библиотека обработки/обработки изображений java?. Для вашего кода вы можете использовать
javax.imageio.ImageIO.write(im, type, represFile);
как вы можете видеть в записать пример изображения в файл.
Ответ 5
Если ваша цель - Android, вы можете попробовать эту замечательную библиотеку 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);