2012-07-09 77 views

回答

24

該解決方案;這個插件可以轉換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> 

參數

  1. :名稱的文件的產生。默認情況下與url中的相同。
  2. 文件夾:要生成文件的目錄的名稱。默認「sdcard /圖片」
  3. 覆蓋:如果文件已經存在,請將其替換。默認爲false。

    我希望這可以解答一些困擾的問題。快樂的編碼!

+1

謝謝。你救了我幾個小時,弄清楚這將如何工作!!我做了一些小改動來支持mp3文件而不是PNG。再次感謝!!!! – ElHacker 2012-11-15 01:25:54

+0

@mcaesar非常感謝,除了一行之外,所有東西都準備就緒:byte [] decodedBytes = Base64.decode(b64String.getBytes());給我以下錯誤:類型Base64中的方法decode(byte [],int)不適用於參數(byte [])由於我不是Java中的專業人員,你能幫我嗎?將不勝感激。 – MarkSmits 2013-04-25 19:20:08

+0

嗨@Mark。請確保您的base64字符串格式良好。見我提供的例子。謝謝。 – mukama 2013-04-26 11:27:25

2

該解決方案僅適用於餵它CLEAN Base64字符串。 換句話說,應該刪除「data:image/png; base64」部分或者Base64解碼器填充失敗,寫入文件時會導致空指針錯誤。

另外我注意到圖像沒有出現在圖庫中,但它正確存儲在SD卡上。當我將它下載到我的PC時,我可以打開它。 不確定這是關於什麼。

感謝您的工作!

+0

感謝您的更正。編輯java以支持完整的「data:image/png; base64」。至於沒有出現在圖庫中的圖片,android僅在存儲驅動器更改狀態(例如從開啓到關閉)時索引媒體文件。 – mukama 2012-07-30 19:03:58

+0

@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

+0

@mcaesar你已經提到你正確的java文件來支持完整的「data:image/png; base64」,但是我擔心你忘了上傳編輯過的文件。謝謝你。 – Stallman 2012-10-10 10:23:40

3

佛有人想用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 
     }); 
    }); 
} 
相關問題