2016-07-14 28 views
1

Ich werde eine TIFF-Datei in mehrere TIFF-Dateien mit dem Trennzeichen II * teilen müssen, also benutze ich den folgenden Code, um die TIFF-Datei zu base64 zu konvertieren und die Teilzeichenfolge zu verwenden Bild . Allerdings bekomme ich den Fehler wie folgt. Bitte geben Sie an, wie Sie nur das erste Bild aus der TIFF-Datei mit diesem Delimiter II * extrahieren (Base64-Code ist SUkq).Geteilte TIFF-Dateien in mehrere Dateien

Ich bin in der Lage, zu Bild zu dekodieren, ohne die Unterzeichenfolge auszuführen.

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) 

Klasse Datei

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

Können Sie diese Lösung versuchen und lassen Sie mich Ihre Kommentare wissen. https://Stackoverflow.com/a/45583553/7731623 –

+0

Dieser Code wird nicht für mich arbeiten, da meine Datei mehrere TIFF-Dateien in einem einzigen enthält und jeder eine separate Metadaten hat. Der Code liest also nur das erste Bild in meiner Datei. Danke für Ihren Vorschlag, ich habe bereits Lösung gefunden, indem Sie das Bild in Byte-Array konvertieren und jedes Bild Zeichen für Zeichen lesen und einem separaten Ausgabestream zuweisen und den gesamten Stream zu einem einzigen TIFF mit twlevemonkeys TIFF-Writer zusammenführen. – Vinoth

Antwort

0

In diesem Code

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

klar auf der Fehlermeldung aus, dass die Zeichenfolge "SUkq" nicht in der Eingabe gefunden wird. Daher entspricht diese Aussage

substring(0,-1) 

Welche ist ungültig. Sie müssen Code hinzufügen, um die Bedingung zu verarbeiten, bei der die Eingabe den gesuchten Text nicht enthält.

Zweitens wird dieser Teilstring nie funktionieren. Da Sie beide Male indexOf eine der Anfang der Zeichenfolge beginnen, auch wenn die Eingabe der Zeichenfolge enthält, die Sie suchen, wird das Ergebnis immer

substring(n,n-1) 

, wo n die Position des Zielzeichenfolge ist. Dieser Bereich ist immer ungültig.

Es ist nicht klar, warum Sie glauben, dass es notwendig ist, Base64 das Bild überhaupt zu kodieren. Suchen Sie stattdessen nur das Byte-Array. Die Base64-Zeichenfolge enthält die Zeichenfolge SUkq nur dann, wenn die unverschlüsselte Zielzeichenfolge mit einem Vielfachen von 3 Offset vom Dateianfang beginnt, da base64 3 Eingabebytes in 4 Ausgabebytes codiert. Wenn der Delimiter in der Eingabe an einem der beiden anderen Offsets (Modulo 3) auftritt, hängt das codierte Ergebnis von den vorherigen und nachfolgenden Daten ab. Daher funktioniert die Verwendung von base64 im Allgemeinen nur, wenn Sie den Offset von garantieren können das Eingabetrennzeichen für alle Fälle, und es ist immer 0 mod 3.

Oh, und nächstes Mal versuchen, durch den Code in Ihrem IDE-Debugger zu gehen. Du hättest schnell gesehen, was passiert ist.

+0

Danke, ist es möglich, die TIFF-Datei mit Bytearray zu teilen? – Vinoth

+0

Es ist möglich, jede Datei in Stücke zu teilen. Ob das für TIFF sinnvoll ist oder nicht (d. H. Es wird zu gültigen separaten Bilddateien führen), weiß ich nicht. Probieren Sie es aus und finden Sie es heraus. –