2016-07-14 37 views
1

デフリプタII *を使用してTIFFファイルを複数のTIFFファイルに分割する必要があるため、以下のコードを使用してtiffファイルをbase64に変換し、イメージ。しかし、私は以下のようなエラーが表示されます。このデリミタII *(base64コードはSUkq)を使用して、tiffファイルから最初のイメージのみを抽出する方法を教えてください。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); 
} 

}、それが明確な文字列"SUkq"入力で発見されていないというエラーメッセージに基づいて

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

このコードで

+0

このソリューションをお試しいただき、ありがとうございます。 https://stackoverflow.com/a/45583553/7731623 –

+0

私のファイルには1つのファイル内に複数のtiffファイルが含まれていて、それぞれに別々のメタデータがあるので、そのコードは私のためには機能しません。したがって、そのコードはファイル内の最初のイメージだけを読み込みます。おかげでありがとうございました。私はすでにイメージをバイト配列に変換し、文字ごとに各イメージを読み込み、別々の出力ストリームに割り当て、twlevemonkeys tiff writerを使ってすべてのストリームを単一のtiffにマージすることで解決策を見つけました。 – Vinoth

答えて

0

。したがって、このステートメントは

substring(0,-1) 

に相当します。これは無効です。入力に探しているテキストが含まれていない状態を処理するコードを追加する必要があります。

二次的に、その部分文字列は決して動作しません。あなたは文字列の先頭にindexOf両方の時間を開始しますので、入力はあなたが探している文字列が含まれていても、結果は常にnがターゲット文字列の位置である

substring(n,n-1) 

になります。この範囲は常に無効です。

なぜ画像をbase64でエンコードする必要があるのか​​はっきりしません。代わりにバイト配列を検索してください。エンコーディングされていないターゲット文字列がファイルの先頭から3の倍数のオフセットで始まる場合にのみ、base64文字列にはSUkq文字列が含まれます。これは、base64が3入力バイトを4出力バイトにエンコードするためです。入力の区切り文字がII*の場合、他の2つのオフセット(モジュロ3)のいずれかでエンコードされた結果が前後のデータに依存するため、base64を使用すると一般的に動作しません。すべての場合の入力区切り記号です。常に0 mod 3です。

あと、次にIDEデバッガのコードを実行してみてください。起こっていたことをすぐに見ていたでしょう。

+0

ありがとう、bytearrayを使用してTIFFファイルを分割することは可能ですか? – Vinoth

+0

任意のファイルをチャンクに「分割」することは可能です。それがTIFFにとって意味のあるものであるかどうか(すなわち、有効な別個の画像ファイルが得られるかどうか)はわかりません。それを試してみてください。 –

関連する問題