2016-07-14 5 views
1

Мне нужно разделить файл tiff на несколько файлов tiff с помощью разделителя II *, поэтому я использую приведенный ниже код для преобразования tiff-файла в base64 и используя подстроку для извлечения первой изображение. Однако я получаю ошибку, как показано ниже. Пожалуйста, сообщите, как извлечь только первое изображение из файла tiff, используя этот разделитель II * (код base64 - SUkq).Сплит файлы TIFF для нескольких файлов

Я могу декодировать изображение без выполнения подстроки.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
at java.lang.String.substring(String.java:1954) 
at EncodeStringTest.main(EncodeStringTest.java:63) 

Класс File

public class EncodeStringTest { 

public static void main(String[] args) { 
    File file = new File("D:\\Users\\Vinoth\\workspace\\image.tif"); 

    try { 
     /* 
     * Reading a Image file from file system 
     */ 
     FileInputStream imageInFile = new FileInputStream(file); 
     byte imageData[] = new byte[(int)file.length()]; 
     imageInFile.read(imageData); 

     /* 
     * Converting Image byte array into Base64 String 
     */ 
     String imageDataString = encodeImage(imageData); 
        System.out.println(imageDataString); 
     String result = imageDataString.substring(imageDataString.indexOf("SUkq") + 1, imageDataString.indexOf("SUkq")); 
     /* 
     * Converting a Base64 String into Image byte array 
     */ 
        System.out.println("Resulted String"+imageDataString); 
     byte[] imageByteArray = decodeImage(result); 

     /* 
     * Write a image byte array into file system 
     */ 
     FileOutputStream imageOutFile = 
          new FileOutputStream("D:\\Users\\Vinoth\\workspace\\image_2.tif"); 
     imageOutFile.write(imageByteArray); 

     imageInFile.close(); 
     imageOutFile.close(); 

     System.out.println("Image Successfully Manipulated!"); 
    } catch (FileNotFoundException e) { 
     System.out.println("Image not found" + e); 
    } catch (IOException ioe) { 
     System.out.println("Exception while reading the Image " + ioe); 
    } 

} 


public static String encodeImage(byte[] imageByteArray){   
    return Base64.encodeBase64URLSafeString(imageByteArray);   
} 


public static byte[] decodeImage(String imageDataString) {  
    return Base64.decodeBase64(imageDataString); 
} 

}

+0

Вы можете попробовать это решение и сообщить мне свои комментарии. https://stackoverflow.com/a/45583553/7731623 –

+0

Этот код не работает для меня, так как мой файл содержит несколько файлов tiff в одном и каждый имеет отдельные метаданные. Таким образом, этот код будет читать только первое изображение в моем файле. Спасибо за ваше предложение, я уже нашел решение, преобразовывая изображение в байтовый массив и считывая каждый символ изображения по символу и назначая отдельный поток вывода и объединяя весь поток с одним тифом, используя twiffemonkeys tiff writer. – Vinoth

ответ

0

В этом коде

substring(imageDataString.indexOf("SUkq") + 1, imageDataString.indexOf("SUkq")) 

это понятно на основании сообщения об ошибке, что строка "SUkq" не найден на входе. Поэтому данное сообщение эквивалентно

substring(0,-1) 

Недействительный. Вам нужно добавить код для обработки условия, когда вход не содержит текст, который вы ищете.

Во-вторых, эта подстрока никогда не будет работать. Поскольку вы начинаете indexOf начала строки оба раза, даже если входные содержит строку, которую вы ищете, то результат всегда будет

substring(n,n-1) 

где n является положением целевой строки. Этот диапазон всегда недействителен.

Непонятно, почему вы считаете необходимым кодирование изображения base64. Вместо этого просто найдите массив байтов. Строка base64 будет содержать строку SUkq только в том случае, если незакодированная целевая строка начинается с кратного 3 смещения от начала файла, так как base64 кодирует 3 входных байта в 4 выходных байта. Если разделитель на входе, II*, происходит в любом из двух других возможных смещений (по модулю 3), закодированный результат будет зависеть от предыдущих и последующих данных, поэтому использование base64 не будет работать вообще, если вы не можете гарантировать смещение входной разделитель для всех случаев, и он всегда 0 mod 3.

О, и в следующий раз попробуйте выполнить код в своем отладчике IDE. Вы бы быстро увидели, что происходит.

+0

Спасибо, возможно ли разделить файл TIFF с помощью bytearray? – Vinoth

+0

Можно «разбить» любой файл на куски. Независимо от того, является ли это значимым для TIFF (т. Е. Приведет ли оно к действительным отдельным файлам изображений), я не знаю. Попробуйте и узнайте. –