Java 如何将多个png图像转换为单个tiff文件
我有几个png格式的图像字节数组。我必须将其转换为tiff文件,然后转换为相应的字节数组。此tiff文件将保存多个图像 我研究了很多,但都没有成功。 问题是。我只能用java做这个!!:) 有人能就我的问题提供一些见解吗 我不会从ImageMagick等中受益,因为我有一个服务器组件来处理此转换,然后将其作为tiff保存在后端。Java 如何将多个png图像转换为单个tiff文件,java,image,png,tiff,Java,Image,Png,Tiff,我有几个png格式的图像字节数组。我必须将其转换为tiff文件,然后转换为相应的字节数组。此tiff文件将保存多个图像 我研究了很多,但都没有成功。 问题是。我只能用java做这个!!:) 有人能就我的问题提供一些见解吗 我不会从ImageMagick等中受益,因为我有一个服务器组件来处理此转换,然后将其作为tiff保存在后端。 客户端给了我一个字节数组,可以转换成png图像。你是想通过编程来实现这一点吗?您可能需要查看ImageMagick() 如果您正在编写某种shell脚本(bash、ba
客户端给了我一个字节数组,可以转换成png图像。你是想通过编程来实现这一点吗?您可能需要查看ImageMagick()
如果您正在编写某种shell脚本(bash、batch),您可以调用
convert
命令(该命令是该软件包的一部分)。否则,ImageMagick的所有功能都可以通过库(C、perl等)获得,您可以尝试与程序链接。我使用ghostscript创建多页PDF文件,你也可以做类似的事情。我的特定应用程序有许多JPG文件,我将这些文件传递给windows上对ghostscript的命令行调用,以创建多页PDF
如果我这样做,我会先将png文件写入磁盘。接下来,使用ghostscript创建多页ps文件,方法是将所有PNG文件作为输入,并输出到sinlge PostScript文档。最后,使用ps2tif之类的工具进行最终转换。您可以通过编程方式编写批处理脚本或让应用程序直接调用命令行应用程序来自动化该过程
这在Unix/Linux环境中可能是最容易做到的,但在Win32上使用相同的工具也是可行的 该库是ImageMagick的Java接口,很可能是您想要的。您应该使用JAI(Java图像API)。它能够读取/写入PNG,至少能够读取TIFF(也应支持写入)
如果不支持写入,请使用Lizard的Tiff Java库()
在此线程中,您可以找到如何将多个文件合并到一个TIFF中。海报在更改TIFF元数据时出现问题,但这不会影响您的问题。
下面是解决方案
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;
}
}
导入javax.imageio.imageio;
导入javax.imageio.ImageWriter;
导入javax.imageio.IIOImage;
导入javax.imageio.ImageWriteParam;
导入javax.imageio.stream.ImageOutputStream;
导入java.awt.image.buffereImage;
导入java.io.*;
导入java.util.Iterator;
/**
*
*
*此类用于将中的多个图像转换为单个多页tiff图像文件。
*
*/
公共类多路径生成器{
私有静态字符串压缩类型=“JPEG”;
公共静态布尔generateMultiPageTiff(字符串dirName,字符串outputFileName)引发异常{
布尔生成=假;
ImageOutputStream ios=null;
ImageWriter=null;
试一试{
//验证映像文件的目录
文件目录=新文件(目录名);
if(null!=dir&!dir.isDirectory()){
抛出新的FileNotFoundException(“不存在具有给定名称“+dirName”的目录);
}
//验证图像文件是否存在
File[]files=dir.listFiles();
if(null==files | | files.length==0){
抛出新的FileNotFoundException(“没有要处理的图像文件”);
}否则{
//在磁盘上创建输出文件
File File=新文件(dirName+outputFileName+“.tif”);
ios=ImageIO.createImageOutputStream(文件);
//获取适当的Tiff图像编写器
迭代器编写器=ImageIO.getImageWritersByFormatName(“tiff”);
if(null==writers | |!writers.hasNext()){
抛出新异常(“未找到相应的Tiff编写器”);
}
writer=ImageIO.getImageWritersByFormatName(“tiff”).next();
writer.setOutput(ios);
//设置Tiff图像的压缩参数
ImageWriteParam参数=writer.getDefaultWriteParam();
//参数setCompressionMode(ImageWriteParam.MODE_显式);
//参数设置压缩类型(压缩类型);
//参数设置压缩质量(0.9F);
//循环浏览所有图像文件并将其写入输出tiff图像
对于(int i=0;i0?dotIndex:files[i].getName().length();
字符串fileName=files[i].getName().substring(0,点索引);
如果(!fileName.equalsIgnoreCase(outputFileName)){
试一试{
fis=新的BufferedInputStream(新文件输入流(文件[i]);
BuffereImage image=ImageIO.read(fis);
IIOImage img=新IIOImage(图像,空,空);
如果(i==0){
writer.write(null、img、param);
}
否则{
writer.writeInsert(-1,img,param);
}
image.flush();
}最后{
如果(null!=fis){
fis.close();
}
}
}
}
ios.flush();
生成=真;
}
}捕获(FileNotFoundException ex){
生成=假;
}捕获(IOEX异常){
生成=假;
}捕获(例外情况除外){
生成=假;
}最后{
如果(空!=ios)
ios.close();
if(null!=写入程序)
writer.dispose();
}
产生的回报;
}
}
我必须完全在java上执行此操作的问题我尝试在java程序中执行此操作,我确实找到了一个解决方案,但它只转换单个物理文件。我在png foramt中有一个字节数组。作为一个有着惊人截止日期的新手,我不得不求助于你们。不确定你们是否还需要这方面的帮助,但是:我不确定这些库是否能够处理字节数组。否则,您可以将该字节数组写入文件,然后使用ImageMagick工具操作该文件;它应该这样标记,而(截至2009年4月27日)目前不是这样。我没有足够高的代表来亲自做这件事:-/我是新来的,我是