将TIFF文件拆分为多个文件

时间:2016-07-14 17:10:49

标签: java base64 tiff

我需要使用分隔符II *将tiff文件拆分为多个tiff文件,因此我使用下面的代码将tiff文件转换为base64并使用子字符串提取第一个图像。但是我收到的错误如下。请告知如何使用此分隔符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)

班级档案

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);
}

}

1 个答案:

答案 0 :(得分:0)

在此代码中

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

根据错误消息很清楚,在输入中找不到字符串"SUkq"。因此,此陈述等同于

substring(0,-1)

哪个无效。您需要添加代码来处理输入不包含您要查找的文本的情况。

其次,该子串永远不会起作用。由于你两次都开始indexOf字符串的开头,即使输入包含你要查找的字符串,结果也总是

substring(n,n-1)

其中n是目标字符串的位置。此范围始终无效。

目前尚不清楚为什么你认为有必要对图像进行base64编码。只需搜索字节数组即可。仅当未编码的目标字符串从文件开头的3倍偏移处开始时,base64字符串才包含SUkq字符串,因为base64将3个输入字节编码为4个输出字节。如果输入中的分隔符II*出现在另外两个可能的偏移量(模3)中,则编码结果将取决于先前和后续数据,因此除非可以,否则使用base64将无法正常工作保证所有情况下输入分隔符的偏移量,它总是0 mod 3.

哦,下次尝试逐步调试IDE调试器中的代码。你很快就会看到发生了什么。