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

0

这是您代码的修改版本,它从多图像 TIFF 文件中读取每个图像,将其拆分并将每个图像作为单图像 TIFF 写回。

请注意,它假设您有一个带有 6 个图像的 TIFF 作为输入,这是最常见的情况(见评论部分)。

public class TiffImageReader {
    public static void main(String[] args) throws IOException {
        File file = new File("C://DS.tiff");
        ImageInputStream iis = ImageIO.createImageInputStream(file);

        Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
        if (readers.hasNext()) {
            // Get TIFF reader, and set input
            ImageReader reader = readers.next();
            reader.setInput(iis);

            // Find number of images, and iterate
            int numImages = reader.getNumImages(true);
            for (int i = 0; i < numImages; i++) {
                // For each image in the file, read and write as standalone TIFF
                BufferedImage image = reader.read(i, null);
                File imageFile = new File(String.format("C://DSCOPY_%d.tiff", i));
                ImageIO.write(image, "tiff", imageFile);
                System.out.println(imageFile.getPath());
            }
        }
        else {
            System.err.printf("No image reader for %s\n", file.getPath());
        }
    }
}
于 2013-08-23T08:43:20.803 回答