需求简介
最近编写web项目使用bootstrap fileinpt 插件上传图片,但是fileinput预览tiff图片加载的太慢了(我认为是预览不了,但是有时候确实能显示出来),所以我决定将tiff图片转为jpeg/png用于预览。
方法1
在网上进行了搜索,需要jai_core.jar和jai_codec.jar包:
在我的资源中也可下载。
实现格式转换,但此方法中的RenderedOp资源不能释放,生成之后原图不能删除;
代码如下:
public class ImgCast {
public static void main(String[] args) {
/* tif转换到jpg格式 */
try {
String input2 = "F:/T20150120002001001.jpg";
String output2 = "F:/T20150120002001001_01.jpg";
RenderedOp src2 = JAI.create("fileload", input2);
OutputStream os2 = new FileOutputStream(output2);
JPEGEncodeParam param2 = new JPEGEncodeParam();
//指定格式类型,jpg 属于 JPEG 类型
ImageEncoder enc2 = ImageCodec.createImageEncoder("JPEG", os2, param2);
enc2.encode(src2);
os2.close();
/*tif转换到bmp格式*/
String inputFile = "F:/T20150120002001001.jpg";
String outputFile = "F:/T20150120002001001_01.bmp";
RenderedOp src = JAI.create("fileload", inputFile);
OutputStream os = new FileOutputStream(outputFile);
BMPEncodeParam param = new BMPEncodeParam();
ImageEncoder enc = ImageCodec.createImageEncoder("BMP", os,param);
enc.encode(src);
os.close();//关闭流
//其他的一样的方式转换 ...
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
相关文档:JAVA 实现jpg/tif/bmp 等图片格式互相转换,解决RenderedOp资源不能释放
该方法也可行,只不过版本太老了,开发及测试阶段都没有遇到问题。
当我部署到linux服务器上时:
RenderedOp renderedOp = JAI.create(“filestore”, pb);
代码报错了。
方法2
- 添加依赖项(pom.xml):(如果使用的不是maven,可自行去maven库maven库 下载相关jar包)
<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();
}
}