Имам компресиран 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