【问题标题】:Android encoding PNG to base64 string producing invalid resultsAndroid将PNG编码为base64字符串产生无效结果
【发布时间】:2017-04-02 05:11:47
【问题描述】:

应用程序将 base64 解码为 PNG,但是当我将文件编码回 base64 以便发送到服务器时,生成的 base64 是不同的并且不会生成图像。

这是原始 base64 字符串的开头: /9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAYAAIdp

这是从 PNG 文件编码后的 base64 的开头: iVBORw0KGgoAAAANSUhEUgAAD8AAAAvQCAIAAABPl1n3AAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO

这是我用来将文件编码为 base64 的代码:

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inDither = true;
        options.inScaled = false;
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        options.inDither = false;

        File file = new File(root +"/saved_images/"+note.imageLocation );
        if(file.exists()){
            // TODO perform some logging or show user feedback
            try {
            Bitmap myBitmap = BitmapFactory.decodeFile(root +"/saved_images/"+note.imageLocation, options);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();


            myBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();

            JSONObject object =new JSONObject();
                object.put("image_type", "image/png");
                object.put("image_data", Base64.encodeToString(byteArray, Base64.DEFAULT));


                if (note.serverID == -1) {
                    toReturn.put(String.valueOf(i), object);
                }else{
                    toReturn.put(String.valueOf(note.serverID), object);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            i--;
        }else{
            Log.i("File Not Found", "NoteModel - "+file);
        }

【问题讨论】:

  • The app decodes base64 to PNG 。您应该开始向我们展示该代码。而且您也没有告诉该 png 保存在哪里。您是否将其保存为文件?

标签: android encoding bitmap base64


【解决方案1】:

试试我的solution,它解释了如何将位图编码为 base64 并将 base64 成功解码回位图。

【讨论】:

    【解决方案2】:

    如果您确实收到了一个 base64 字符串并将其解码为您保存到文件中的 png 字节而不使用中间位图,那么您应该将该 png 文件加载到字节缓冲区中并将该字节缓冲区编码为您将要使用的 base64 字符串上传。

    如果您确实使用位图来保存图像,那么这是一个坏主意。

    不要使用类BitmapBitmapFactory 来启动和下载文件。您最终会得到不同的图像。

    【讨论】:

      【解决方案3】:

      请试试这个代码,

       public String encodeToBase64(Bitmap image) {
          Bitmap immagex = Bitmap.createScaledBitmap(image, 350, 350, true);
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          immagex.compress(Bitmap.CompressFormat.PNG, 100, baos);
          byte[] b = baos.toByteArray();
          String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
          Log.e("LOOK", imageEncoded);
          return "data:image/png;base64," + imageEncoded.replace(" ", "").replace("\n", "");
      }
      
      public Bitmap encodeToBitmap(String encodedImage) {
          encodedImage = encodedImage.substring(encodedImage.indexOf(",") + 1);
          byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
          Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
          return bitmap;
      }
      

      【讨论】:

      • 感谢您的回答。恐怕这根本没有任何区别:(
      • 尝试解码和编码两种方法,如果有帮助的话
      • 不幸的是仍然没有帮助:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多