2013-03-15 22 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一起生活,这将会起作用。