0

6 つの画像で圧縮された tiff 画像を読み取り、画像を 6 つの異なる tiff ファイルに分割する必要があります。さまざまな画像を識別するために、xml ファイルからこのようなオフセット値を取得しています。

First image :data_offset :0
             data_length :7827
Second Image: data_offset :7827
              data_length :9624
Third Image:  data_offset :17451 ( i.e 7827+9624)
              data_length :5713
Fourth Image: data_offset :23164 (7827+9624+5713)
              data_length :9624

… 6 つの画像すべてについて同様に。

個々の画像のオフセットと長さがあります。元の tiff ファイルをオフセットと長さに従って別の tiff 画像に分割する方法。

以下で使用しているコードは、元の tiff ファイルを読み取り、同じファイルをコピーしています。出力は、単一の画像を含む tiff ファイルです。

public class TiffImageReader {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        File file = new File("C://DS.tiff");
        FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        try {
            for (int readNum; (readNum = fis.read(buf)) != -1; ) {
                //Writes to this byte array output stream
                bos.write(buf, 0, readNum);
                System.out.println("read " + readNum + " bytes,");
            }
        }
        catch (IOException ex) {
            Logger.getLogger(ConvertImage.class.getName()).log(Level.SEVERE, null, ex);
        }

        byte[] bytes = bos.toByteArray();
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        Iterator<?> readers = ImageIO.getImageReadersByFormatName("tiff");
        ImageReader reader = (ImageReader) readers.next();
        Object source = bis;
        ImageInputStream iis = ImageIO.createImageInputStream(source);
        reader.setInput(iis, true);
        ImageReadParam param = reader.getDefaultReadParam();
        Image image = reader.read(0, param);
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(image, null, null);
        File imageFile = new File("C:// DSCOPY.tiff");
        ImageIO.write(bufferedImage, "tiff", imageFile);
        System.out.println(imageFile.getPath());
    }
}

バイトを 1 にして、最初のオフセット 7827 で echeck を実行し、画像を書き込もうとすると、ArrayOutofIndex が表示されます。

"for (int readNum; (readNum = fis.read(buf)) !== 7827;)"

オフセットと長さを使用してファイルを分割する方法は?

助けてください。

4

1 に答える 1