将base64 imageString转换为位图以在ImageView中显示,在位图中显示null

Luf*_*ffy 9 android android-volley

(编辑)的

  • 在浏览器中访问API时,它正在下载图像.网址是http://example.com/api/v1/filedownloader.json?file=GvygDaYb64wUon0lxp2H1458543376.

  • 我更改了服务器名称并添加example.com到该URL.因此在浏览器中运行时不会下载图像文件.但是你可以在这里看到图像文件 .

  • 然后我用编码工具解码工具检查了文件.

  • 解码后,我得到了.bin file.然后我变成了.png format.只有这样我才能得到准确的图像.

  • 我不知道如何做所有这些功能来获取图像并在imageView中显示它.

  • 无论如何我用这个尝试了下面的代码:

logcat的:

03-24 04:29:43.816: E/OnResponse(15392): ÿØÿà??JFIF????????????ÿí??Photoshop 3.0??8BIM??????????g??9dXpsI_ORS9jWIcxWfWe(??bFBMD01000abe030000070e0000c51a0000161c0000251d0000bc2000007f350000fc370000323a00003f3c0000f4620000ÿâICC_PROFILE??????lcms????mntrRGB XYZ Ü????????)??9acspAPPL????????????????????????????????????????????????????öÖ??????????Ó-lcms??????????????????????????????????????????????????????????????????????????????????????????????
03-24 04:29:43.816: E/OnResponse(15392): desc??????ü??????^cprt????\??????wtpt????h??????bkpt????|??????rXYZ??????????gXYZ????¤??????bXYZ????¸??????rTRC????Ì??????@gTRC????Ì??????@bTRC????Ì??????@desc??????????????c2????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????text????????FB????XYZ ????????????öÖ??????????Ó-XYZ ????????????????3????¤XYZ ????????????o¢????8õ????XYZ ????????????b????·????ÚXYZ ????????????$ ????????¶Ïcurv????????????????????ËÉckö?Q4!ñ)2;FQw]íkpz±|¬i¿}ÓÃé0ÿÿÿÛ??C??       
03-24 04:29:43.816: E/OnResponse(15392):    

"##!  %*5-%'2(  .?/279<<<$-BFA:F5;<9ÿÛ??C
03-24 04:29:43.816: E/OnResponse(15392): 9& &99999999999999999999999999999999999999999999999999ÿÂ??¸¸??"??ÿÄ????????????????????????????ÿÄ??????????????????????????ÿÄ??????????????????????????ÿÚ??????????íÐÙG,!.Ph5ð8ò÷¸¥®ÐàÔ§DUdº
de??kP'.¤ÅS BG  ìóölâvw@+.ÆÖ®©$¸
Ø
03-24 04:29:43.816: E/OnResponse(15392): K¥Yp ³ºXC¹O/)u RÉuEÊ$£³UÂP©hL^ÅÌ ·üûÌ%§ EU-1i6Ss©,ÞÌõ®{·W¹k`¤I!kwt%ÙeP¦*Ôªóï-¿
03-24 04:29:43.816: E/OnResponse(15392):  l"4áá#^-KSIBá¯S¨jYeîÌùucÓq}Lvå^ jÍ [Bz¾·í'nUï#tE  ÂQ(äf)Uw(5ݨG/cUÙÀSAIÓ(´ÌÑY.,±iíÒ«Bଽ^pvf;TAX,KÄEµ XbìÜHqßìx¯Wf    ¬«R\¤.ªªì#IOYçx=ÿ??7+J%g(ªÉM*ÖhÙ­¶ìíZMøØ¹s^²Èó¡fº­(%F¬î\ÓF¥§*ÇÈÉ+«Çu{H륭]G4Q%A]Eñî>±3¦Y:,tÖØ&:×F3Óf]¡9ÖõQ9Zã??ÕZ3¼9zIÖy¶ÓT ÓPֺϫ@eÎv ìô}¿%ên[Tz)h6v¹n­,h°°?ÅfìÓOÇZ1ЮÑCdÖJí³íÁ±ÌN·VcÔpÐèkEÃ`W°+5hg
`Eçg4µãß4VzÆÏ[ã½-x7¨A`ºÊD5Wå®ky{º¬ZùöeÔÏG¶Br    VD&´³·
&µçY׬fLDLEP²¬X°2®æ¹\{Æ|°o{¾¦®w* Kªj2ÖåÉâ??nkv¼yöÐC3·±MÎWÆ%ÈmÞ  e??æÌè*ÍsgJSWPØ+bn]@0×<¸7cßnçé³Ü߸pª(©AÕÂÖV*ϯNlë^¬:ùõÝjfz½©vuwV4nvFåf°ÒT±0&§c,³ Yv#tUH\%Ø\ÚÇ6¹-úr[n}ÃêÈÊ`J¡£!  t¬ªÍ£<7VMXë³Fmú¹«vwED¥pÐlÌ6k!m+[lI@2Ò¬êÂhFè© jl%\Gfß Ìäï¿>o!jJ²Ìn¡,®XJg"<ÊH!»±ô±ÔÞ¶c¦¥ÙÝÚÙ  `HwW¨Â]¡Â;R´eZ¦Í.¡T`-MSs3ståS|˧ØY¢VÛ1ÌA^¶"­¹Id"¹¹=,»ùÄô0o¾=©7¥ù¦u¶ò:WÚa..ÊAÙ F®tXhÐåJB#)Â1bj±jhÙÍÍÒæôåV,×-^ãÃûPúuë9rj#D^®4WFªêÞ_sÇÓÈáú(?¥r2³¡'äa¥y]yÖfúRàîèGf´¦vuóñCYë³Gj¹$t&
03-24 04:29:43.816: E/OnResponse(15392): ftK4]Oc¾yØ;u^ØÎûÀ!×ÎÖZ±yVµv    ÐÙËò¿/.ÃÇìr±Ó6ìÚõdÌél0MU±:æ3¤¼æµ¸é[qêÍ}´õà\ÈÚÍg³å^{0½*ÃÓÎò£¨Äàb«Óæëë/£¬Îo|½æîV{ðUµr®1É.¥Ü.
¥!ù±ÐyÝNo>ØõfÔ\ãuvc=C¨².¥H:M$º$£\é:·
dt(ÓZÆP×ró¬³P-P¥µR¯ü]9wØÕóínnÿ??+£æùç
pçRv¢E¢òêNw1j>]¸ë65.çլ첢² 1ì0aÝÉVrÀ¦] j¬eµpïÍeä×]9vW&;§ÑùßA߯éɽc®|n Ù!æYbÔ£¢èLVwñïËÍÕâGUÙuã©°hC-eEg~u
03-24 04:29:43.816: E/OnResponse(15392):  MnK9Û0ìW¥Îzr¥º.êVÅBrjǬKOx%³*·µÍßÛÍììòúÉrCÍBcAXrÅ1Þ;Óçã¦Xusé jLS[uXïFuJf¡«²Ãôb|t3µ¶¢£(XÂÐùwË£ÒÌÖ¢#:qê^o·T??ä%gÈ`*WQlJ N×EÌéx®4»õáÓÃÓ±n6f6


03-24 04:29:43.816: D/skia(15392): --- SkImageDecoder::Factory returned null

03-24 04:29:43.816: E/myBitmap(15392): null

03-24 04:29:43.816: D/AndroidRuntime(15392): Shutting down VM
03-24 04:29:43.817: E/AndroidRuntime(15392): FATAL EXCEPTION: main
03-24 04:29:43.817: E/AndroidRuntime(15392): Process: com.steve.test, PID: 15392
03-24 04:29:43.817: E/AndroidRuntime(15392): java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
03-24 04:29:43.817: E/AndroidRuntime(15392):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:596)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.steve.test.SecondActivity$1.onResponse(SecondActivity.java:121)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.steve.test.SecondActivity$1.onResponse(SecondActivity.java:1)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:1)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at android.os.Handler.handleCallback(Handler.java:739)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at android.os.Handler.dispatchMessage(Handler.java:95)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at android.os.Looper.loop(Looper.java:135)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at android.app.ActivityThread.main(ActivityThread.java:5221)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at java.lang.reflect.Method.invoke(Native Method)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at java.lang.reflect.Method.invoke(Method.java:372)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-24 04:29:43.817: E/AndroidRuntime(15392):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Run Code Online (Sandbox Code Playgroud)

SecondActivity.java:

 public class SecondActivity extends AppCompatActivity {


    String base64String;
    Bitmap bitmap;
    ImageView img ;

     String userValidationURL, base64;
     byte[] data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);

        img = (ImageView)findViewById(R.id.imageView);

        base64String = "GvygDaYb64wUon0lxp2H1458543376";

        userValidationURL = "http://example.com/api/v1/filedownloader.json?file=GvygDaYb64wUon0lxp2H1458543376"; 

       hitSearchApi(); 
    }

    private void hitSearchApi(){

            Log.e("userValidationUrl", userValidationURL);

            StringRequest request = new StringRequest(Request.Method.GET, userValidationURL, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    if(response != null && !response.startsWith("<HTML>")){
                        Log.e("OnResponse", response);                                               

                    byte[] decodedString = Base64.decode("GvygDaYb64wUon0lxp2H1458543376", Base64.DEFAULT);
                    Bitmap myBitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

                    Log.e("mybitmap", ""+myBitmap);
                                            img.setImageBitmap(Bitmap.createScaledBitmap(myBitmap, img.getWidth(), img.getHeight(), false));

                        dialog.dismiss();

                    }else{

                        Log.e("onResponseElse", "onResponseElse");

                        dialog.dismiss();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    if(error != null){
                        Log.e("error", error.toString());
                        dialog.dismiss();
                    }

                }
            }){
                @Override
                protected Map<String,String> getParams(){
                    Map<String,String> params = new HashMap<String, String>();

                    params.put("file", base64String);

                    Log.e("paramsImg", ""+params);

                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("Content-Type","application/x-www-form-urlencoded");
                    return params;
                }
            };
        RequestQueue queue = Volley.newRequestQueue(SecondActivity.this);
        queue.add(request);
        queue.getCache().remove(userValidationURL);    
    }        
}
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题?为什么我要进入null位图.任何人都可以帮助我.

Ani*_*she 7

正如您从日志中看到的那样

E/myBitmap:null

这意味着您无法解码位图.请参考这个答案

将Base64字符串转换为位图

还要确保您采取适当的方法取决于您是否收到

data:image/jpg;base64
Run Code Online (Sandbox Code Playgroud)

在base64编码的字符串中.那是切片的一部分

data:image/jpg;base64
Run Code Online (Sandbox Code Playgroud)

从字符串然后解码它 Base64.DEFAULT

或者,Base64.URL_SAFE如果你正在切片,请使用.

编辑: 更改以下行loadImage

Bitmap myBitmap = BitmapFactory.decodeStream(input);
Run Code Online (Sandbox Code Playgroud)

BufferedReader in = new BufferedReader(new InputStreamReader(input));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

String encodedImage = response.toString();
byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
Bitmap myBitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
Run Code Online (Sandbox Code Playgroud)

此外,如果它不起作用,让我知道encodedImage字符串的值是什么.还要确保

data:image/jpg;base64
Run Code Online (Sandbox Code Playgroud)

没有在回复中传递.

如果您在验证字符串是否为图像时遇到问题,可以使用以下内容创建一个简单的html页面

<!DOCTYPE html>
<html>
<head>
    <title>Base 64 Sample</title>
</head>
<body>

<img src="data:image/< png/jpeg/gif etc goes here >;base64,< image content goes here>">

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

用适当的内容替换'<','>'中的内容并在浏览器中打开html页面.或者,您可以转到链接并将字符串粘贴到那里.


sar*_*ate 5

您正在获得正确的base64编码字符串.只需将该String转换为bitmap使用以下代码:

byte[] decodedString = Base64.decode(StrBase64, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
imageView1.setImageBitmap(decodedByte);
Run Code Online (Sandbox Code Playgroud)


TWi*_*Rob 3

03-24 04:29:43.816: D/skia(15392): --- SkImageDecoder::Factory 返回 null

这表明输入BitmapFactory.decode在某种程度上是无效的。

下面我列出了一些可能欺骗您的场景,但不确定哪一种适用,因为您没有透露真实的 Url,并且您发布的代码甚至没有尝试解码来自网络的数据。

Base64 填充

您的硬编码输入字符串GvygDaYb64wUon0lxp2H1458543376不是有效的 Base64 编码字符串。要了解为什么在页面上输入它:http://string-functions.com/base64decode.aspx,它会说:

Base-64 字符数组的长度无效。

将其更改为GvygDaYb64wUon0lxp2H1458543376==(注意结尾),它会向您显示奇怪的字形,但这只是因为它是二进制数据,所以它成功解码。

奇怪的是,Base64当缺少填充时,类应该抛出异常,但你没有得到......

您还可以检查 Chrome 中编码字符串的内容,将其输入到新选项卡的地址栏中(在逗号后替换,请参阅有效示例):

data:image/png;base64,GvygDaYb64wUon0lxp2H1458543376==
Run Code Online (Sandbox Code Playgroud)

我看到一个小正方形,这可能不是图像(请参阅下一节)。

Base64 格式

您尝试解码的样本也采用某种奇怪的格式。它不是 Android 系统支持的 PNG/GIF/JPEG 文件,它缺少标头。查看支持的格式列表:http://developer.android.com/guide/appendix/media-formats.html(向下滚动到图像),这些是您可以加载的数据类型。

我尝试在笔记本电脑上使用多个成像软件加载那个短字节[],但没有任何东西将其识别为图像文件,我同意他们的观点,我也无法在十六进制编辑器中看到任何类似图像的内容。

Base64 - 不!

如果您尝试解码该变量,response请确保它是 Base64 编码的字符串。上面的日志中是一个 JPEG 文件,但它可能已损坏。请注意,您使用的是 StringRequest,只有当您确实获得由[a-zA-Z0-9+/=]字符组成的 Base64 字符串时,它才会起作用。

要读取二进制数据,您需要触发不同类型的请求,该请求根据您的网络库而有所不同,但关键点是,如果您收到字符串格式的二进制数据,则意味着对其应用了一些文本编码,但是二进制数据没有字符编码,它只是简单的 0x00-0xFF 字节,没有任何解释。

BitmapFactory.decodebyte[]仅当您从网络库接收 或InputStream(Reader也有关联的文本编码,这对于二进制数据来说是错误的)时,二进制数据才有效。