JAI jar包转换tif文件报错解决办法,多页tif转多个jpeg方法


1. 定义文件枚举类

/**
 * 文件类型枚举类
 *
 */
public enum FileType {
		/**  
	    * JEPG.  
	    */  
	    JPEG("FFD8FF"),   
	       
	   /**  
	    * PNG.  
	    */  
	   PNG("89504E47"),   
	      
	   /**  
	    * GIF.  
	    */  
	    GIF("47494638"),   
	       
	    /**  
	     * TIFF.  
	     */  
	    TIFF("49492A00"), 
	    
	    /**  
	     * TIF.  
	     */  
	    TIF("49492A00"),
	       
	    /**  
	     * Windows Bitmap.  
	     */  
	    BMP("424D"),   
	       
	    /**  
	     * Rich Text Format.  
	     */ 
	    RTF("7B5C727466"),   
	       
	    /**  
	     * XML.  
	     */  
	    XML("3C3F786D6C"),   
	       
	    /**  
	     * HTML.  
	     */  
	    HTML("68746D6C3E"),   
	   

	    /**  
	     * Adobe Acrobat.  
	     */  
	    PDF("255044462D312E"),   
	       
	   
	    /**  
	     * ZIP Archive.  
	     */  
	    ZIP("504B0304"),   
	       
	    /**  
	     * RAR Archive.  
	     */  
	    RAR("52617221"),   
	       
	    /**  
	     * Wave.  
	     */  
	    WAV("57415645"),   
	       
	    /**  
	     * AVI.  
	     */  
	    AVI("41564920"); 
	    
	    private String value = "";
	    
	    private FileType(String value) {
	    	this.value = value;
	    }
	    
	    public String getValue() {
	    	return value;
	    }
	    
	    public void setValue(String value) {
	    	this.value = value;
	    }
}

2. 定义文件类型的工具类,来判断文件类型

/**  
 * 文件类型判断类  
 */  
public final class FileTypeJudge {   
       
    /**  
     * Constructor  
     */  
    private FileTypeJudge() {}   
       
    /**  
     * 将文件头转换成16进制字符串  
     *   
     * @param 原生byte  
     * @return 16进制字符串  
     */  
    private static String bytesToHexString(byte[] src){   
           
        StringBuilder stringBuilder = new StringBuilder();      
        if (src == null || src.length <= 0) {      
            return null;      
        }      
        for (int i = 0; i < src.length; i++) {      
            int v = src[i] & 0xFF;      
            String hv = Integer.toHexString(v);      
            if (hv.length() < 2) {      
                stringBuilder.append(0);      
            }      
            stringBuilder.append(hv);      
        }      
        return stringBuilder.toString();      
    }   
      
    /**  
     * 得到文件头  
     *   
     * @param filePath 文件路径  
     * @return 文件头  
     * @throws IOException  
     */  
    private static String getFileContent(String filePath) throws IOException {   
           
        byte[] b = new byte[28];   
           
        InputStream inputStream = null;   
           
        try {   
            inputStream = new FileInputStream(filePath);   
            inputStream.read(b, 0, 28);   
        } catch (IOException e) {   
            e.printStackTrace();   
            throw e;   
        } finally {   
            if (inputStream != null) {   
                try {   
                    inputStream.close();   
                } catch (IOException e) {   
                    e.printStackTrace();   
                    throw e;   
                }   
            }   
        }   
        return bytesToHexString(b);   
    }   
    /**  
     * 判断文件类型  
     *   
     * @param filePath 文件路径  
     * @return 文件类型  
     */  
    public static FileType getType(String filePath) throws IOException {   
           
        String fileHead = getFileContent(filePath);   
           
        if (fileHead == null || fileHead.length() == 0) {   
            return null;   
        }   
           
        fileHead = fileHead.toUpperCase();   
           
        FileType[] fileTypes = FileType.values();   
           
        for (FileType type : fileTypes) {   
            if (fileHead.startsWith(type.getValue())) {   
                return type;   
            }   
        }   
           
        return null;   
    }   
}

3. 在使用jai jar包调用时,先判断类型,再根据具体类型传递具体参数

/***
     * 将单个TIF转换为多个JPEG文件
     * @param srcFile
     * @param destFile
     * @return
     */
    private static List<String> convertMTifToMJPEG(String srcFile, String destFile) {
        List<String> jpegFiles = new ArrayList<String>() ;
         try{
             FileSeekableStream ss = new FileSeekableStream(srcFile);
             TIFFDecodeParam param0 = null;
             TIFFEncodeParam param = new TIFFEncodeParam();
             JPEGEncodeParam param1 = new JPEGEncodeParam();
             FileType fileType = FileTypeJudge.getType(srcFile);
             ImageDecoder dec = ImageCodec.createImageDecoder(fileType.toString().toLowerCase(), ss, param0);
             int count = dec.getNumPages();
             param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
             param.setLittleEndian(false); 
             for (int i = 0; i < count; i++) {
                 RenderedImage page = dec.decodeAsRenderedImage(i);
                 File f = new File(destFile + i + DOT + WaterMarkDownloadFileType.JPEG.name().toLowerCase());
                 ParameterBlock pb = new ParameterBlock();
                 pb.addSource(page);
                 pb.add(f.toString());
                 pb.add(WaterMarkDownloadFileType.JPEG.name());
                 pb.add(param1);
                 RenderedOp r = JAI.create("filestore",pb);
                 r.dispose();
                 jpegFiles.add(destFile + i + DOT + WaterMarkDownloadFileType.JPEG.name().toLowerCase()) ;
             }
         } catch (IOException e) {
             e.printStackTrace();
         }
         return jpegFiles;
    }


转载于:https://my.oschina.net/u/2002410/blog/482183

要将多页 TIFF 转换成一张图片,你可以使用 Java Advanced Imaging API(JAI)和 Java Image IO API。以下是一个示例代码: ```java import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.plugins.tiff.TIFFImageReadParam; import javax.imageio.plugins.tiff.TIFFImageWriteParam; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.ImageOutputStream; import javax.media.jai.JAI; import javax.media.jai.RenderedOp; public class TIFFUtils { public static BufferedImage convertToSinglePageTIFF(byte[] tiffBytes) throws IOException { ImageReader reader = ImageIO.getImageReadersByFormatName("TIFF").next(); ImageInputStream iis = ImageIO.createImageInputStream(new ByteArrayInputStream(tiffBytes)); reader.setInput(iis); // Read the first page RenderedOp op = JAI.create("stream", reader); BufferedImage image = op.getAsBufferedImage(); // Write the first page to a new TIFF file ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next(); ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream); writer.setOutput(ios); TIFFImageWriteParam writeParam = (TIFFImageWriteParam) writer.getDefaultWriteParam(); writeParam.setCompressionMode(TIFFImageWriteParam.MODE_DEFAULT); writeParam.setCompressionType("LZW"); IIOMetadata metadata = writer.getDefaultImageMetadata(reader.getImageTypes(0).next(), writeParam); writer.write(metadata, new javax.imageio.IIOImage(image, null, metadata), writeParam); // Write the rest of the pages to the new TIFF file for (int i = 1; i < reader.getNumImages(true); i++) { op = JAI.create("stream", reader); image = op.getAsBufferedImage(); writer.write(null, new javax.imageio.IIOImage(image, null, null), writeParam); } writer.dispose(); ios.close(); iis.close(); // Read the new TIFF file and return the image byte[] singlePageTiffBytes = outputStream.toByteArray(); reader = ImageIO.getImageReadersByFormatName("TIFF").next(); iis = ImageIO.createImageInputStream(new ByteArrayInputStream(singlePageTiffBytes)); reader.setInput(iis); op = JAI.create("stream", reader); BufferedImage singlePageImage = op.getAsBufferedImage(); reader.dispose(); iis.close(); return singlePageImage; } } ``` 这个方法接受一个多页 TIFF 的字节数组作为输入,并返回一个合并后的 BufferedImage。它首先使用 Java Image IO API 读取多页 TIFF,然后将每个页面写入一个新的单页 TIFF 文件。接下来,它使用 Java Image IO API 读取新的单页 TIFF 文件,并返回合并后的 BufferedImage。 希望这可以帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值