- PR -

Javaでの、Base64記述された画像ファイルの変換について

1
投稿者投稿内容
tarou00
会議室デビュー日: 2008/09/11
投稿数: 3
投稿日時: 2008-09-11 02:54
 はじめまして、いつも楽しく閲覧させていただいています。

 現在、JavaでBase64デコードを行うプログラムを組んでいます。
 文字列に関しては上手くデコードすることが出来たのですが、画像ファイルの変換〜保存がいまいち上手くいかず、悩んでおります。

 Base64のデコードにはorg.apache.commons.codec.binary.Base64を用い、以下のHPを参考に、次のようなプログラムを組みました。

 参考にしたHP:http://d.hatena.ne.jp/kent013/20080812/1218547711


------------------------------------------------------------------------

public void base64Decode(){
try{
String data = "data:image/jpg;base64,〜省略"
byte[] bytes = Base64.decodeBase64(data.getBytes());
ByteArrayInputStream input = new ByteArrayInputStream(bytes);
BufferedImage image = ImageIO.read(input);
FileOutputStream output =
new FileOutputStream("c:\\\\test.jpg");
ImageIO.write(image, "jpg", output);
}catch(IOException e){
}
}

-------------------------------------------------------------------------

 このまま実行すると、

java.lang.IllegalArgumentException: im == null!
at javax.imageio.ImageIO.write(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)

 というようなエラーが表示され、読み込めない画像ファイルが生成されてしまいます。
 色々検索し、過去ログの関連記事を拝見させても頂いたのですが、いまいち原因が分からず困っております。
 もし、どなたかお詳しい方がいらっしゃいましたら、アドバイスを頂けないでしょうか。よろしくお願い致します。

[ メッセージ編集済み 編集者: tarou00 編集日時 2008-09-11 10:25 ]
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-09-11 08:47
「画像ファイルの変換」というのは、bitmap→jpegのことですか?
それとも、base64→画像バイナリファイルのこと?

問題を小さな単位に切り分けるといいですね。

- (画像)base64のデコード
- デコード結果のファイル出力
- 出力された画像ファイルの変換(bitmap→jpeg)

どれがうまくいっていないんでしょう?
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-09-11 08:49
Base64のデコードをする前にdataから「data:image/jpg;base64,」は削除しないといけないですよ。

↑が根本的な原因かどうかはわかりませんので、ImageIO.read()の返り値のnullチェックをしてみるとか、BufferedImageの縦横サイズを表示してみて期待通りになっているかなどもチェックしてみてください。
tarou00
会議室デビュー日: 2008/09/11
投稿数: 3
投稿日時: 2008-09-11 09:20
>スフレさん
 仰ると通り、data:image/jpg;base64,の部分を削除してデコードしてみたところ、上手くいきました。この部分でずっと悩んでいたので、本当にありがとうございました。

>Java僧さん
 言葉足らずで申し訳ありません、base64→画像バイナリファイルのことでした。
 どうやらデコードの部分が上手くいっていなかったようです。
 問題を小さな単位に分けて考える、すごくためになります。ありがとうございました。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-09-11 09:20
元々jpgで入ってるなら、ImageIOなんぞ挟まずにそのままFileOutputStreamに落とせば良いのでは?
いずれにせよ、すでに書かれているようにcontent-type部の削除は必要ですが。
tarou00
会議室デビュー日: 2008/09/11
投稿数: 3
投稿日時: 2008-09-11 09:40
>mioさん
 mioさんの仰るようにFileOutputStreamでも作成してみました。こちらの方が面倒がなく、良いようですね。
 一度そちらの形式でも組んでは見たのですが、いまいち上手くいかずに今の形にしていました。
 結局はBase64のデコード部分が上手くいっていなかったようで、きちんとデコードできているならどちらでもいけるのですね。
 お恥ずかしい限りです、勉強になりました。本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)