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