2012-07-09 101 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 
     }); 
    }); 
} 
相关问题