Java 将位图写入MIME消息
编辑2:根据我第一次编辑的结果,在文章的底部,问题出现在这一行或下面:Java 将位图写入MIME消息,java,android,bitmap,base64,mime,Java,Android,Bitmap,Base64,Mime,编辑2:根据我第一次编辑的结果,在文章的底部,问题出现在这一行或下面:imageEncodedSigneAgent=Base64.encodeToString(byteSigneAgent,Base64.NO_WRAP)” /编辑 我尝试在MIME消息中编写位图,作为PNG格式的Base64字符串。遗憾的是,该消息被视为null(windows viewer无法读取,称大小为0kb) 我的代码: Bitmap bitmapSigne = BitmapFactory.decodeF
imageEncodedSigneAgent=Base64.encodeToString(byteSigneAgent,Base64.NO_WRAP)代码>”
/编辑
我尝试在MIME消息中编写位图,作为PNG格式的Base64字符串。遗憾的是,该消息被视为null(windows viewer无法读取,称大小为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消息中写入了64行基线,但它不能被读取,可能有点短。我想它可能是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问题的想法:)将字符串重新转换为位图,但失败了:(
我在这里遗漏了什么?为什么我无法正确检索字节数据并在base64中获取可读字符串
任何帮助,谢谢
我以前使用Base64.DEFAULT没有更好的结果。我读了几篇文章,其中一篇链接的内容与我想做的最接近,遗憾的是,他的问题在于“equalTo”的用法不当
编辑:所以我试着做位图->字节[]->位图,结果成功了:
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
内容配置:表单数据;name=“body”;filename=“20150601.190623\u 00008\u 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
注意到另外一行了吗?是的,这就是所有的人。旁注:新TException(…)
显然没有任何作用。你的意思可能是抛出新TException(…)
是的,是的。你不知道,但它是一个自定义异常包装器,没有调用“throw”方法可能是一个糟糕的设计。它可能不是一个很好的设计。从发布的代码中不清楚,但可能是对象的创建没有用。此外,创建异常的子类有助于捕获它。并且throw
关键字会立即解释发生了什么。你能发布日志吗?嗨,如果你认为这对你有帮助,我可以发布MIME消息。不会引发异常。检查我的编辑,问题不在那里,它在代码下面的某个地方。
Content-Disposition: form-data; name="body";filename="20150601.190623_00008_SIGN.PNG"
Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAAOYAAABuCAIAAAC86/hZAAAAA3NCSVQICAjb4U/gAAAZsEl