2013-03-15 27 views
0

我一直試圖從許多BufferedImage格式的較小圖像中繪製一個巨大的圖像文件(使用一個大的BufferedImage需要比我更多的內存),現在正在嘗試通過ImageWriter類的replacePixels-Function。寫入TIFF:非法字節順序

但是;我得到一個令人費解的錯誤甚至廣泛Googleing無法修復,所以我希望這裏有人能告訴我,我做錯了什麼:

javax.imageio.IIOException: Illegal byte order 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.locateIFD(TIFFImageWriter.java:2813) 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.readIFD(TIFFImageWriter.java:3076) 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.canReplacePixels(TIFFImageWriter.java:3099) 
at drawingTiles.WorldMapMaker$1.writeImg(WorldMapMaker.java:90) 
at drawingTiles.WorldMapMaker$1.run(WorldMapMaker.java:148) 
at java.lang.Thread.run(Unknown Source) 
javax.imageio.IIOException: Illegal byte order 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.locateIFD(TIFFImageWriter.java:2813) 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.readIFD(TIFFImageWriter.java:3076) 
at com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriter.prepareReplacePixels(TIFFImageWriter.java:3141) 
at drawingTiles.WorldMapMaker$1.writeImg(WorldMapMaker.java:104) 
at drawingTiles.WorldMapMaker$1.run(WorldMapMaker.java:148) 
at java.lang.Thread.run(Unknown Source) 

我知道一個字節順序是什麼,我不知道如何字節順序可能是非法的。這是我使用的功能:

public void writeImg (String path, int startx, int starty, BufferedImage image){ 
      File output = new File(path); 
      ImageOutputStream ios = null; 
      try { 
       ios = ImageIO.createImageOutputStream(output); 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 

      Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("TIF"); 
      ImageWriter writer = (ImageWriter)iter.next(); 
      writer.setOutput(ios); 

      TIFFImageWriteParam writeParam = new TIFFImageWriteParam(Locale.ENGLISH); 
      writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 

      try{ 
       if(writer.canReplacePixels(0)){ // LINE 90 
        System.out.println("True"); 
       }else{ 
        System.out.println("False"); 
       } 
      }catch (IOException e) { 
       e.printStackTrace(); 
      } 

      Point destinationOffset = new Point(startx,starty); 
      writeParam.setDestinationOffset(destinationOffset); 

      try { 
       writer.prepareReplacePixels(0, new Rectangle(0, 0, image.getWidth(), image.getHeight())); // LINE 104 
       writer.replacePixels(image, writeParam); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

回答

0

如果你看看這裏,你可以看到源TiffImageWriter

我看到在locateIfd()此代碼:

long startPos = stream.getStreamPosition(); 

    stream.seek(headerPosition); 
    int byteOrder = stream.readUnsignedShort(); 
    if (byteOrder == 0x4d4d) { 
     stream.setByteOrder(ByteOrder.BIG_ENDIAN); 
    } else if (byteOrder == 0x4949) { 
     stream.setByteOrder(ByteOrder.LITTLE_ENDIAN); 
    } else { 
     stream.seek(startPos); 
     throw new IIOException("Illegal byte order"); 
    } 

當setOutput()被調用有關此流,一個構件組稱爲headerPosition,這是在該點的流的當前位置。該代碼尋找回到那一點,並尋找英特爾或摩托羅拉字節順序,如果發現其他東西,則會拋出。我猜,當locateIfd被調用時,你的流在錯誤的地方。

另一方面,圖像有多大?我問,因爲我爲一家擁有an image processing library的公司工作,而且我們的圖像模型能夠使用比連續的更復雜的存儲器模型構建的圖像,我可以想象製作一個由存在於其他位置的圖像列表組成的複合存儲器模型虛擬化它們。我認爲我們現在被迫使用內置的Tiff編解碼器,並且我們會和你一起呆在同一條船上,但如果你能和Png一起生活,這將會起作用。