2008-11-11 34 views
5

Tôi đang gặp sự cố khi chuyển đổi png sang tiff. Việc chuyển đổi diễn ra tốt đẹp, nhưng hình ảnh rất lớn. Tôi nghĩ vấn đề là tôi không thực hiện nén đúng cách? Bất cứ ai có bất cứ đề nghị ??Nén Tiff bằng Java ImageIO

Đây là mẫu mã

public static void test() throws IOException { 

    // String fileName = "4958813_1"; 
    String fileName = "4848970_1"; 
    String inFileType = ".PNG"; 
    String outFileType = ".TIFF"; 

    ImageIO.scanForPlugins(); 

    File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType); 
    InputStream fis = new BufferedInputStream(new FileInputStream(
      fInputFile)); 
    PNGImageReaderSpi spi = new PNGImageReaderSpi(); 
    ImageReader reader = spi.createReaderInstance(); 

    ImageInputStream iis = ImageIO.createImageInputStream(fis); 
    reader.setInput(iis, true); 
    BufferedImage bi = reader.read(0); 

    TIFFImageWriterSpi tiffspi = new TIFFImageWriterSpi(); 
    ImageWriter writer = tiffspi.createWriterInstance(); 
    //Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("TIFF"); 
    //ImageWriter writer = iter.next(); 

    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

    param.setCompressionType("LZW"); 
    param.setCompressionQuality(0.5f); 
    File fOutputFile = new File("I:\\HPF\\UU\\" + fileName + outFileType); 
    ImageOutputStream ios = ImageIO.createImageOutputStream(fOutputFile); 
    writer.setOutput(ios); 
    writer.write(bi); 

} 

Trả lời

9

Writer.getDefaultWriteParam() chỉ tạo đối tượng ImageWriteParam, nó không liên kết lại với bất kỳ mục đích nào khác.

Tôi không thấy bất kỳ cơ chế nào trong mã của bạn cho đối tượng param đã sửa đổi của bạn sau đó được sử dụng trong ImageWriter.

Tôi tin rằng thay vì:

writer.write(bi); 

bạn cần sử dụng:

writer.write(null, new IIOImage(bi, null, null), param); 
3

Tôi không biết Java IO, nhưng nói chung bạn muốn xem xét một vài điều

  1. Bạn có thể sử dụng nén JPEG thay vì LZW?
  2. Xem cách đặt kích thước dải TIFF - nếu kích thước nhỏ là những gì bạn muốn, hãy đặt kích thước đó ở độ cao của hình ảnh.

Edit: Trông giống như một TiffWriteParam có các phương pháp sau

tiffWriteParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT); 
tiffWriteParam.setTiling(imageWidth, imageHeight, 0, 0); 

thiết lập imageWidth và imageHeight vars kích thước của hình ảnh của bạn. Nhược điểm là nó sẽ chậm hơn để đọc ra các vùng của hình ảnh.

Các vấn đề liên quan