Android不允许基于Phonegap的应用程序等本机应用程序编写二进制文件。一个常见的应用是将Base64字符串转换为图像。那么,你如何解决这个问题呢?Phonegap插件:如何将Base64字符串转换为Android中的PNG图像
回答
该解决方案;这个插件可以转换Base64 PNG字符串并将图像生成到SD卡。我们走吧!
1. Base64编码解码器
获取称为MiGBase64此极快的Base64编码/解码器类。从SourceForge下载它。在项目的src /文件夹中创建一个名为'util'的文件夹。将下载的课程放在那里。
2. java的
创建一个名为 '组织/阿帕奇/科尔多瓦' 你的项目的src /文件夹中的文件夹。 使用以下源代码在其中创建一个名为“Base64ToPNG.java”的Java文件。
package org.apache.cordova;
/**
* A phonegap plugin that converts a Base64 String to a PNG file.
*
* @author mcaesar
* @lincese MIT.
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import android.os.Environment;
import java.io.*;
import org.json.JSONException;
import org.json.JSONObject;
import util.Base64;
public class Base64ToPNG extends Plugin {
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
if (!action.equals("saveImage")) {
return new PluginResult(PluginResult.Status.INVALID_ACTION);
}
try {
String b64String = "";
if (b64String.startsWith("data:image")) {
b64String = args.getString(0).substring(21);
} else {
b64String = args.getString(0);
}
JSONObject params = args.getJSONObject(1);
//Optional parameter
String filename = params.has("filename")
? params.getString("filename")
: "b64Image_" + System.currentTimeMillis() + ".png";
String folder = params.has("folder")
? params.getString("folder")
: Environment.getExternalStorageDirectory() + "/Pictures";
Boolean overwrite = params.has("overwrite")
? params.getBoolean("overwrite")
: false;
return this.saveImage(b64String, filename, folder, overwrite, callbackId);
} catch (JSONException e) {
e.printStackTrace();
return new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage());
} catch (InterruptedException e) {
e.printStackTrace();
return new PluginResult(PluginResult.Status.ERROR, e.getMessage());
}
}
private PluginResult saveImage(String b64String, String fileName, String dirName, Boolean overwrite, String callbackId) throws InterruptedException, JSONException {
try {
//Directory and File
File dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dirName, fileName);
//Avoid overwriting a file
if (!overwrite && file.exists()) {
return new PluginResult(PluginResult.Status.OK, "File already exists!");
}
//Decode Base64 back to Binary format
byte[] decodedBytes = Base64.decode(b64String.getBytes());
//Save Binary file to phone
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
fOut.write(decodedBytes);
fOut.close();
return new PluginResult(PluginResult.Status.OK, "Saved successfully!");
} catch (FileNotFoundException e) {
return new PluginResult(PluginResult.Status.ERROR, "File not Found!");
} catch (IOException e) {
return new PluginResult(PluginResult.Status.ERROR, e.getMessage());
}
}
}
3. JavaScript的
写JavaScript作为Base64ToPNG.js到项目的WWW文件夹。不要忘记在你的HTML文件中包含对它的引用。
/**Works on all versions prior and including Cordova 1.6.1
* by mcaesar
* MIT license
*
*/
(function() {
/* This increases plugin compatibility */
var cordovaRef = window.PhoneGap || window.Cordova || window.cordova; // old to new fallbacks
/**
* The Java to JavaScript Gateway 'magic' class
*/
function Base64ToPNG() { }
/**
* Save the base64 String as a PNG file to the user's Photo Library
*/
Base64ToPNG.prototype.saveImage = function(b64String, params, win, fail) {
cordovaRef.exec(win, fail, "Base64ToPNG", "saveImage", [b64String, params]);
};
cordovaRef.addConstructor(function() {
if (!window.plugins) {
window.plugins = {};
}
if (!window.plugins.base64ToPNG) {
window.plugins.base64ToPNG = new Base64ToPNG();
}
});
})();
4. plugins.xml文件
添加以下RES/XML/plugins.xml文件
<plugin name="Base64ToPNG" value="org.apache.cordova.Base64ToPNG"/>
5.最后,HTML实施例和参数
<button onclick="test();">No optional params required, Cowboy.</button> </br>
<button onclick="test2();">Make PNG with some parameters</button>
<script src="Base64ToPNG.js" type="text/javascript"></script>
<script type="text/javascript">
//May have a mime-type definition or not
var myBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="//a red dot
function test(){
//Illustrates how to use plugin with no optional parameters. Just the base64 Image.
window.plugins.base64ToPNG.saveImage(myBase64, {},
function(result) {
alert(result);
}, function(error) {
alert(error);
});
}
//No mimetype definition example
var myOtherBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
function test2(){
//Shows how to use optional parameters
window.plugins.base64ToPNG.saveImage(myBase64, {filename:"dot.png", overwrite: true},
function(result) {
alert(result);
}, function(error) {
alert(error);
});
}
</script>
个参数
- 名:名称的文件的产生。默认情况下与url中的相同。
- 文件夹:要生成文件的目录的名称。默认“sdcard /图片”
覆盖:如果文件已经存在,请将其替换。默认为false。
我希望这可以解答一些困扰的问题。快乐的编码!
该解决方案仅适用于喂它CLEAN Base64字符串。 换句话说,应该删除“data:image/png; base64”部分或者Base64解码器填充失败,写入文件时会导致空指针错误。
另外我注意到图像没有出现在图库中,但它正确存储在SD卡上。当我将它下载到我的PC时,我可以打开它。 不确定这是关于什么。
感谢您的工作!
感谢您的更正。编辑java以支持完整的“data:image/png; base64”。至于没有出现在图库中的图片,android仅在存储驱动器更改状态(例如从开启到关闭)时索引媒体文件。 – mukama 2012-07-30 19:03:58
@mcaesar 我对你的插件有3个问题: 1.我发现参数“folder”应该是:sdcard/somedirectory_name而不是“somedirectory_name”。 2.我在仪器中设置了一个断点: byte [] decodedBytes = Base64.decode(b64String.getBytes());在Base64ToPNG.java中为 。 我发现Base64.decode(〜)返回NULL。 3.在您的描述中,您说“将下载的类放在那里”,但我只获取文件:Base64.java。有什么问题吗? 我真的需要你的插件来将我的画布转换成.png文件,并将其保存在本地系统中。请给我一些指导。 – Stallman 2012-10-10 10:08:07
@mcaesar你已经提到你正确的java文件来支持完整的“data:image/png; base64”,但是我担心你忘了上传编辑过的文件。谢谢你。 – Stallman 2012-10-10 10:23:40
佛有人想用kineticjs使用,下面的工作一种享受:
function saveCanvas() {
$('#save').bind($bind, function(){
stage.toDataURL({
callback: function(dataUrl){
window.plugins.base64ToPNG.saveImage(dataUrl.substr(22,dataUrl.length), {},
function(result) {
alert(result);
}, function(error) {
alert(error);
}
);
},
mimeType: 'image/png',
quality: 0.5
});
});
}
- 1. 将png或jpg图像转换为Android中的Base64字符串
- 2. 如何将Base64字符串转换为Png图像Mvc5 C#?
- 3. 如何将base64字符串图像转换为android中的blob?
- 4. 如何在Android中将Base64 Blob字符串转换为图像?
- 5. 如何将图像转换为文件中的Base64字符串?
- 6. 使用Phonegap将图像转换为iOS上的Base64字符串
- 7. 如何将图像转换为base64字符串android?
- 8. 如何将base64 svg图像转换为base64图像png
- 9. 如何将png图像字符串数据转换为png?
- 10. 如何将base64-encode图像转换为imagemagick中的PNG图像?
- 11. 将Base64字符串转换为android中的图像
- 12. 将base64字符串转换为Android中的图像
- 13. 将base64字符串转换为Android中的图像
- 14. 如何将base64字符串转换为图像文件?
- 15. 如何将图像转换为java中的base64字符串?
- 16. 如何将base64字符串保存为Qt中的png图像?
- 17. 将base64字符串转换为perl图像magick中的图像
- 18. 如何到Base64 PNG图像串为PNG格式转换成C#
- 19. 将base64图像数据转换为png?
- 20. 如何将图像转换为Base64字符串?
- 21. 如何将图像转换为base64字符串
- 22. 如何将base64字符串转换为PIL图像对象
- 23. 如何将base64字符串转换为图像?
- 24. 将图像文件转换为base64使用javascript的字符串
- 25. 如何将图像从Picturebox(VB6中的图像)转换为字符串(Base64)?
- 26. 我如何转换图像作为字符串PNG文件
- 27. 将Base64字符串转换为图像文件?
- 28. 将Base64字符串转换为图像附件
- 29. 将base64字符串转换为Java中的图像
- 30. 将base64字符串转换为wcf服务中的图像c#
谢谢。你救了我几个小时,弄清楚这将如何工作!!我做了一些小改动来支持mp3文件而不是PNG。再次感谢!!!! – ElHacker 2012-11-15 01:25:54
@mcaesar非常感谢,除了一行之外,所有东西都准备就绪:byte [] decodedBytes = Base64.decode(b64String.getBytes());给我以下错误:类型Base64中的方法decode(byte [],int)不适用于参数(byte [])由于我不是Java中的专业人员,你能帮我吗?将不胜感激。 – MarkSmits 2013-04-25 19:20:08
嗨@Mark。请确保您的base64字符串格式良好。见我提供的例子。谢谢。 – mukama 2013-04-26 11:27:25