У меня есть сжатый файл изображения tiff с шестью сжатыми изображениями (не на нескольких страницах). У меня есть смещение и длина данных для каждого изображения

Мне нужно прочитать изображение tiff, сжатое из 6 изображений, и разделить изображения на 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 и поставлю echeck на первое смещение 7827 и попытаюсь записать изображение.. Он показывает ArrayOutofIndex..

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

Как использовать смещение и длину для разделения моего файла?

Пожалуйста, помогите.


person user2709718    schedule 23.08.2013    source источник
comment
Можете ли вы описать, как устроен файл TIFF? У вас есть один файл, состоящий из 6 отдельных потоков TIFF? Или у вас есть смещения в данные изображения одного изображения TIFF? Или какая-то другая структура? Сжаты ли данные изображения (и если да, то какое сжатие)?   -  person Harald K    schedule 23.08.2013


Ответы (1)


Вот модифицированная версия вашего кода, который считывает каждое изображение из вашего файла TIFF с несколькими изображениями, разбивает его и записывает каждое изображение обратно как одно изображение TIFF.

Обратите внимание, что предполагается, что у вас есть один TIFF с 6 изображениями в качестве входных данных, что является наиболее распространенным случаем (см. Раздел комментариев).

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());
        }
    }
}
person Harald K    schedule 23.08.2013