2013-09-02 14 views
11

私は画像ファイルからのデータURLを持っており、それを別の関数に渡す必要があります。 Data-URLからBufferedImageまでのこのパスに沿って、byteArrayである必要があります。データURLをBufferedImageに変換する

String dataUrl; 
byte[] imageData = dataUrl.getBytes(); 

// pass the byteArray along the path 

// create BufferedImage from byteArray 
BufferedImage inputImage = ImageIO.read(new ByteArrayInputStream(imageData)); 

// If the picture is null, then throw an unsupported image exception. 
if (inputImage == null) { 
    throw new UnknownImageFormatException(); 
} 

問題があるが、それは常にinputImageとは、ImageIO.readはにimagetypeを認識しなかったことを意味する、ヌルであることを意味しUnknownImageFormatException例外をスロー:

私のアプローチは、以下の通りでした。

私がサポートするファイル名を取得するImageIO.getReaderFormatNamesを()を使用して、次のリストを持っている:限りdata:image/png;base64,...またはdata:image/jpg;base64,...

Supported Formats: 
jpg, BMP, bmp, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif 

私は合格してみてくださいdataURLsは次のようにしています私は、それらがサポートされているファイルリストにあることを認識しています。

他に、この場合、inputImageがnullになる可能性がありますか?さらに興味深いですが、どうすれば解決できますか?

+3

StringをBase64からImageIOで読み取ることができるバイナリ形式にデコードする必要があります.URLオブジェクトを持っている場合はImageIO – MadProgrammer

+2

に直接渡すこともできます。@MadProgrammerのアドバイスに加えて、[' DatatypeConverter'](http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html#method_summary)を使用して、ベース64文字列を 'byte []'に変換します。 –

答えて

16

コメントは既に述べたように、画像データはBase64でエンコードされています。バイナリデータを取得するには、型/エンコーディングヘッダを取り除き、Base64コンテンツをバイナリデータにデコードしなければなりません。私はアパッチ共通のコーデックからorg.apache.commons.codec.binary.Base64を使用

String encodingPrefix = "base64,"; 
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length(); 
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex)); 

、他のBase64デコーダも同様に動作するはずです。

+5

Java 8では、コアJDKにBase64エンコーダ/デコーダがあります。http://download.java.net/jdk8/docs/api/java/util/Base64.html – Jules

3

RFC2397文字列を持つ唯一の問題は、データの前にすべてのものとの仕様ですが、data:,オプション:

data:[<mediatype>][;base64],<data> 

だから、これを会計ピュアJava 8ソリューションは、次のようになります。

もちろん
final int dataStartIndex = dataUrl.indexOf(",") + 1; 
final String data = dataUrl.substring(dataStartIndex); 
byte[] decoded = java.util.Base64.getDecoder().decode(data); 

dataStartIndexをチェックする必要があります。

関連する問題