将位图写入 MIME 消息

Write Bitmap to a MIME message

编辑 2:根据我在第一次编辑中得到的结果,在 post 的底部,问题出在这一行或以下的某处:imageEncodedSigneAgent = Base64.encodeToString(byteSigneAgent,Base64.NO_WRAP); " /编辑。

我尝试在 MIME 消息中写入位图,作为 PNG 格式的 Base64 字符串。遗憾的是,该消息被认为是空的(windows 查看者无法阅读它,说大小是 0kb)

我的代码:

        Bitmap bitmapSigne = BitmapFactory.decodeFile(fileSigne.getAbsolutePath());
        if (Params.tagFgDebug && fgDebugLocal){Log.i(Params.tagGen, tagLocal + "createEMLInt - bitmapSigne width = " + bitmapSigne.getWidth());};
        ByteArrayOutputStream baos = new ByteArrayOutputStream(bitmapSigne.getByteCount());  
        if (!bitmapSigne.compress(Bitmap.CompressFormat.PNG, 100, baos)) {
            new TException(tagLocal, "Compress bitmapSign == ", "false");
        }
        byte[] byteSigne = baos.toByteArray(); 
        if (Params.tagFgDebug && fgDebugLocal){Log.i(Params.tagGen, tagLocal + "createEMLInt - byteSigne size = " + byteSigne.length);};
        String imageEncodedSigne = Base64.encodeToString(byteSigne,Base64.NO_WRAP);
        if (Params.tagFgDebug && fgDebugLocal){Log.i(Params.tagGen, tagLocal + "createEMLInt - imageEncodedSigne size = " + imageEncodedSigne.length());};
        mime.append(imageEncodedSigne);
        mime.append("\r\n");

这确实在我的 MIMI 消息中写入了 base64 行,但它无法读取并且可能有点短。我认为它可能是 PNG 周围的元数据(来自我解码后阅读的内容)。

我测试过将位图直接保存到文件中,效果很好:

        // test to retrieve BitMap as PNG
        String signePath2 = Baseline.strSdExternalPath + File.separator + Params.MIF_REP;
        File file = new File(signePath2, "sign.png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmapSigne.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();
        // test to retrieve BitMap as PNG

我正确地得到了我之前绘制的图像。

我也试过(来自另一个 SO 问题的想法:Converting bitmap to byte array, to string, then all the way back)将字符串重新转换为位图,但失败了:(

            byte[] newImageBytes = imageEncodedSigne.getBytes();
        // Convert byte[] back to bitmap
        Bitmap bitmapReconverted = BitmapFactory.decodeByteArray(newImageBytes, 0, newImageBytes.length);
        File fileReconverted = new File(signePath2, "signReConverted.png");
        fOut = new FileOutputStream(fileReconverted);
        bitmapReconverted.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();

我在这里错过了什么?为什么我无法正确检索字节数据并在 base64 中获取可读字符串?

感谢任何帮助!

我之前用过Base64.DEFAULT没有更好的结果。我读了几本 post,链接的那个最接近我想做的,遗憾的是他的问题是 'equalTo'

的使用不当

编辑:所以我尝试做 Bitmap -> bytes[] -> Bitmap 并且成功了:

Bitmap bitmapReconverted = BitmapFactory.decodeByteArray(byteSigne, 0, byteSigne.length);
        File fileReconverted = new File(signePath2, "signReConverted.png");
        fOut = new FileOutputStream(fileReconverted);
        bitmapReconverted.compress(Bitmap.CompressFormat.PNG, 85, fOut);
        fOut.flush();
        fOut.close();

编辑 3:用于文档目的的 MIME 结果!

Content-Type: image/png

内容配置:表单数据;名称="body";文件名=“20150601.190623_00008_SIGN.PNG” 内容传输编码:base64 iVBORw0KGgoAAAANSUhEUgAAAOYAAABuCAIAAAC86/hZAAAA

除这部分外,一切都是正确的:

Content-Disposition: form-data; name="body";filename="20150601.190623_00008_SIGN.PNG" 
Content-Transfer-Encoding: base64 
iVBORw0KGgoAAAANSUhEUgAAAOYAAABuCAIAAAC86/hZAAAAA3NCSVQICAjb4U/gAAAZsEl

应该这样写:

Content-Disposition: form-data; name="body";filename="20150601.190623_00008_SIGN.PNG" 
Content-Transfer-Encoding: base64 

iVBORw0KGgoAAAANSUhEUgAAAOYAAABuCAIAAAC86/hZAAAAA3NCSVQICAjb4U/gAAAZsEl

注意到附加行了吗?是的,这就是所有人。