我有几个 png 格式的图像的字节数组。我必须将其转换为 tiff 文件,然后转换为相应的字节数组。此 tiff 文件将包含多个图像。
我已经搜索了很多,但我没有成功。问题是。我只需要在java中做到这一点!:) 任何人都可以就我的问题提供一些见解吗?
我不会从 ImageMagick 等中受益,因为我有一个处理此转换的服务器组件,然后将其作为 tiff 保存在后端。客户端给了我一个字节数组,它将转换为 png 图像。
下面是解决方案。
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;
/**
*
*
* This class is used to convert the multiple images in to single multi-pages tiff image file.
*
*/
public class MultiPageTiffGenerator {
private static String compressionType="JPEG";
public static boolean generateMultiPageTiff(String dirName,String outputFileName) throws Exception{
boolean generated=false;
ImageOutputStream ios=null;
ImageWriter writer=null;
try {
// verify the directory for the image files
File dir = new File(dirName);
if(null!=dir && !dir.isDirectory()){
throw new FileNotFoundException("No directory exists with the given name"+dirName);
}
// verify the images files exist
File[] files = dir.listFiles();
if(null == files || files.length == 0){
throw new FileNotFoundException("No image files to process");
}else{
// Create the output file on the disk
File file = new File(dirName+outputFileName+".tif");
ios = ImageIO.createImageOutputStream(file);
// Get the appropriate Tiff Image Writer
Iterator <ImageWriter> writers=ImageIO.getImageWritersByFormatName("tiff");
if(null== writers || ! writers.hasNext()){
throw new Exception("Appropriate Tiff writer not found");
}
writer = ImageIO.getImageWritersByFormatName("tiff").next();
writer.setOutput(ios);
// Set the compression parameters for Tiff image
ImageWriteParam param = writer.getDefaultWriteParam();
//param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
//param.setCompressionType(compressionType);
//param.setCompressionQuality(0.9F);
// Loop through all image files and write them to output tiff image
for (int i = 0; i < files.length; i++) {
InputStream fis=null;
int dotIndex= files[i].getName().lastIndexOf('.');
dotIndex=dotIndex>0?dotIndex:files[i].getName().length();
String fileName = files[i].getName().substring(0,dotIndex);
if(!fileName.equalsIgnoreCase(outputFileName)){
try{
fis = new BufferedInputStream(new FileInputStream(files[i]));
BufferedImage image = ImageIO.read(fis);
IIOImage img = new IIOImage(image, null, null);
if (i == 0) {
writer.write(null, img, param);
}
else {
writer.writeInsert(-1, img, param);
}
image.flush();
}finally{
if(null!=fis){
fis.close();
}
}
}
}
ios.flush();
generated=true;
}
}catch(FileNotFoundException ex){
generated=false;
}catch(IOException ex){
generated=false;
}catch(Exception ex){
generated=false;
}finally{
if(null!=ios)
ios.close();
if(null!=writer)
writer.dispose();
}
return generated;
}
}
JMagick库是 ImageMagick 的Java接口,很可能是您想要的。
您是否尝试以编程方式执行此操作?您可能想查看 ImageMagick ( http://www.imagemagick.org/script/index.php )
如果您正在编写某种类型的 shell 脚本(bash、批处理),您可以调用convert
命令(这是该包的一部分。)否则,ImageMagick 的所有功能都可以通过您自己的库(C、perl 等)获得可以尝试与您的程序链接。
我使用 ghostscript 创建多页 PDF 文件,您也许可以做类似的事情。我的特定应用程序有许多 JPG 文件,我将这些文件传递给 Windows 上的 ghostscript 命令行调用,以创建多页 PDF。
如果我这样做,我会先将 png 文件写入磁盘。接下来使用ghostscript创建一个多页ps文件,将所有PNG文件作为输入,并输出到一个单一的PostScript文档。最后,使用 ps2tif 之类的东西进行最终转换。您可以通过以编程方式编写批处理脚本或让您的应用程序直接调用命令行应用程序来自动化该过程。
这在 Unix/Linux 环境中可能是最容易做到的,但在 Win32 上使用相同的工具是可行的。
您应该使用 JAI(Java Imaging API)。它能够读取/写入PNG,至少能够读取TIFF(也应该支持写入)。
http://java.sun.com/products/java-media/jai/iio.html
如果不支持编写,请使用 Lizard 的 Java 的 Tiff 库 ( http://www.lizardworks.com/libs.html )
在此线程中,您可以找到如何将多个文件合并到一个 TIFF 中。海报在更改 TIFF 元数据时遇到问题,但这不会影响您的问题。 http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0