0

私のプロジェクトでは、グレースケール 8BPP 形式の Base64 でエンコードされた画像を受け取ります。これを BufferedImage に変換するのに問題があります。ディスクから画像(f.ex png)を読み取り、それをbase64でエンコードし、プロセスを逆にするときに機能するコードがいくつかあります。

とにかく、受け取った文字列を変換しようとすると、すべてが機能しているように見えますが、null が返されます。呼び出されるのは catch ではなく、null を返す ImageIO.read です。

助言がありますか?base64 文字列が有効であることはわかっています。生ファイルとして保存して、画像を適切に表示するエディターで開いてみたからです。

これは私のコードです:

public static BufferedImage convertBase64StringToBufferedImage(String base64String){
    byte[] pictureBytes = Base64Coder.decode(base64String);

    InputStream is = new ByteArrayInputStream(pictureBytes);

    BufferedImage image;
    try {
        image = ImageIO.read(new ByteArrayInputStream(pictureBytes));
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
    return image;
}
4

1 に答える 1

0

ドキュメントから:

現在登録されているものの中から自動的に選択された ImageReader を使用して、提供された InputStream をデコードした結果として BufferedImage を返します。InputStream は ImageInputStream にラップされます。結果のストリームを読み取ることができると主張する登録済みの ImageReader がない場合は、null が返されます。

実行されるコードは次のとおりです。

public static BufferedImage read(ImageInputStream stream)
    throws IOException {
    if (stream == null) {
        throw new IllegalArgumentException("stream == null!");
    }

    Iterator iter = getImageReaders(stream);
    if (!iter.hasNext()) {
        return null;                  // <~~~~~ here's your null
    }

    ImageReader reader = (ImageReader)iter.next();
    ImageReadParam param = reader.getDefaultReadParam();
    reader.setInput(stream, true, true);
    BufferedImage bi;
    try {
        bi = reader.read(0, param);
    } finally {
        reader.dispose();
        stream.close();
    }
    return bi;
}

おそらくImageReader、適切な MIME タイプに基づいて明示的に を取得し、そのリーダーで (上記のように) コードを読み取ることができます。

于 2013-07-24T13:36:24.460 に答える