0

私はBufferedImage形式でたくさんの小さな画像から巨大な画像ファイルを描画しようとしてきました(1つの大きなBufferedImageを使用すると、私が持っているよりも多くのメモリを消費します)、現在、replacePixels-ImageWriterクラスの関数を介してこれを実行しようとしています。

でも; 大規模なGoogleでも修正できない不可解なエラーが発生するので、ここの誰かが私が間違っていることを教えてくれることを願っています。

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();
            }
        }
4

1 に答える 1

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 というメンバーが設定されます。このコードは、そのポイントに戻って、Intel または Motorola のバイト オーダーを探し、それ以外が見つかった場合はスローします。locateIfd が呼び出されたときに、ストリームが間違った場所にあると推測しています。

余談ですが、画像のサイズはどれくらいですか?私は、Java 用の画像処理ライブラリを持っている会社で働いており、私たちの画像モデルには、連続したものよりも複雑なメモリ モデルから画像を構築する機能があり、画像のリストから作成された複合メモリ モデルを作成することを想像できるため、質問します。それらを仮想化する他の場所に存在します。私たちは現在、組み込みの Tiff コーデックを使用することを余儀なくされていると思います。私たちはあなたが覚えているのと同じボートに乗っていると思いますが、Png と一緒に暮らすことができれば、これはうまくいくでしょう。

于 2013-03-15T15:37:09.763 に答える