質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Java

    13157questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swift

    6700questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Android

    6235questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • iOS

    3798questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • JSON

    1062questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Androidで、encodeされた文字列のBitmap変換について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 146

kazzzstudio

score 86

アプリケーションサーバーからencodeされた文字列(画像データ)をdecodeしてBitmapに変換する処理を作成しています。

コードは以下のようになります。

InputStream _input_stream = URLDecoder.decode(json_data.getString("profile_picture"));
Bitmap bmp = BitmapFactory.decodeStream(_input_stream), "UTF-8"));

ImageView _image = (ImageView)view.findViewById(R.id.image_view);
_image.setImageBitmap(bmp);

しかし、例外が発生して、bad base-64というエラーが返ってきてしまいます。

他に試したことは、
・android.util.Base64でなくorg.apache.commons.codec.binary.Base64を使う

byte [] encodeByte=Base64.decode(encodedString,Base64.DEFAULT);


・Base64.DEFAULTだけでなく、URL_SAFEなど、全オプションを試す

いずれもうまく行きませんでした。jsonで送られてくる文字列に問題がありそうですが、全く同じデータがiOS(Swift)では正しく画像に変換できています。

let _clinic_image: UIImage? = json_data["profile_picture"].string!.urlDecode()

public func urlDecode() -> UIImage? {
    var img: UIImage = UIImage()

    let base64String = self.replacingOccurrences(of: " ", with: "+")

    let decodeBase64:NSData? =
        NSData(base64Encoded:base64String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)


    if let decodeSuccess = decodeBase64 {
        img = UIImage(data: decodeSuccess as Data)!
    }

    return img
}

Swiftで行なっている処理そのものをAndroidでも実現したいのですが、うまくいきません。
どなたかご助言をいただけないでしょうか?

よろしくお願いします。

[追記]

アドバイスいただいた内容をもとにソースコードを変更しました。結果はbad base-64エラーは消えましたが、bmpはnullになってしまいます。

String _profile_picture = data.getString("profile_picture").substring(0, data.getString("profile_picture").length()-1).replaceAll("\n", "").replaceAll(" ", "+");
InputStream is = new ByteArrayInputStream(_profile_picture.getBytes("utf-8"));
Bitmap bmp = BitmapFactory.decodeStream(is);

SwiftでNSData.Base64DecodingOptions.ignoreUnknownCharactersを外すと、Android同様に画像が表示できなくなってしまうことから、なんらかの不適切な文字が入っていることに原因があるのではないかと推測していますが、特定できていない状況です。

お分かりになる方がいらっしゃいましたらアドバイスいただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kazzzstudio

    2018/05/29 15:17

    これまでにいただいたアドバイスから問題を整理して追記しました。お手数をおかけして申し訳ありません。

    キャンセル

  • kakajika

    2018/05/29 22:44

    追記されたコードの中にはBase64のデコード処理が入っていないようですが、このコード以外の箇所でやっているのでしょうか?

    キャンセル

  • kazzzstudio

    2018/05/29 23:07

    BitmapFactory.decodeStream(is)がdecode処理に相当すると認識していました。Base64のデコードが入っていなかったです。

    キャンセル

回答 1

0

options: NSData.Base64DecodingOptions.ignoreUnknownCharacters

これでうまくいって

BitmapFactory.decodeStream(_input_stream), "UTF-8"));
(かっこが多いような)

ignoreUnknownCharacters
という意味で解釈すればいいのでは

                    InputStream is = null;
                    try{
                        is = urlConnection.getInputStream();
                        bmp = BitmapFactory.decodeStream(is);
                        is.close();
                    } catch(IOException e){
                        e.printStackTrace();
                    } finally{
                        if(is != null){
                            is.close();
                        }
                    }


リンク内容

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/29 12:43

    ご回答、ありがとうございます。

    コードを下記のように書き換えました。

    InputStream is = new ByteArrayInputStream(data.getString("profile_picture").getBytes("utf-8"));
    Bitmap bmp = BitmapFactory.decodeStream(is);

    しかし、例外は消えたものの、bmpがnulになってしまいます。
    画像に(少なくてもSwiftでは)変換できるとした場合、何か他にignoreUnknownCharactersに当たる部分をAndroidで実装する方法はありませんでしょうか?

    キャンセル

  • 2018/05/29 13:30

    Swift(iOS)でignoreUnknownCharactersを指定しないとどうなるんでしょうか?

    キャンセル

  • 2018/05/29 13:47

    SwiftでignoreUnknownCharactersの指定をやめたところ、画像が出力されなくなってしまいました。

    キャンセル

  • 2018/05/29 13:51 編集

    Base64エンコード時に改行コードを含まないようにするか、Androidでのデコード時に改行コードを除去するか、どちらか簡単に試せますか?

    キャンセル

  • 2018/05/29 14:30

    Androidでのデコード時に、
    "string".replaceAll("\n", "")
    を追加してみましたが、結果は変わりませんんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13157questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swift

    6700questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Android

    6235questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • iOS

    3798questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • JSON

    1062questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。