【问题标题】:Convert image into base64string in JQuery在 JQuery 中将图像转换为 base64string
【发布时间】:2016-02-13 21:44:42
【问题描述】:

我正在开发 VS2015 cordova 应用程序。我想将图像的 base 64 字符串发送到另一台服务器。当我从图库中获取图像并将其转换为 base64string 时出现问题。我成功获得了base64string,但是当我显示它时,我总是得到黑色图像。这是我的代码:

   function onPhotoURISuccess(imageURI) {
     var largeImage = document.getElementById('smallImage');
    largeImage.style.display = 'block';
    largeImage.src = imageURI;
    basestrg = encodeImageUri(imageURI);

}

function getPhoto(source) {
           navigator.camera.getPicture(onPhotoURISuccess, onFail, {
        destinationType: Camera.DestinationType.NATIVE_URI, mediaType: Camera.MediaType.Photo,
        sourceType: source
    });
}
function encodeImageUri(imageUri) {
    var c = document.createElement('canvas');
    var ctx = c.getContext("2d");
    var img = new Image();
    img.onload = function () {
        c.width = this.width;
        c.height = this.height;
        ctx.drawImage(img, 0, 0);
    };
    img.src = imageUri;
    var dataURL = c.toDataURL("image/jpeg");
    return dataURL;
}

请指教。

【问题讨论】:

  • 检查base64字符串是否以标识符开头,如果不确定添加它。
  • 您使用异步回调在onload 绘制图像。所以当你建立dataUrl时,图像下方的几行还没有绘制出来
  • @seahorsepip 什么是标识符?
  • @Paolo 请解释我应该怎么做
  • 原图是typejpeg吗?

标签: javascript jquery cordova visual-studio-cordova


【解决方案1】:

这与上下文无关,但可能会对您有所帮助。 您可以直接从您的 html5 表单上传图片。

<form enctype="multipart/form-data" action="upload.php" method="post">    
    <input name="userImage" type="file" accept="image/*;capture=camera">    
    <button type="submit">Submit</button>
</form>

获取upload.php文件中的图片数据并保存为图片。在 PHP 中使用 $_FILES 数组,在 C# 中使用 HttpContext 来保存图像。
参考:Using form input to access camera and immediately upload photos using web app

【讨论】:

    【解决方案2】:

    当您尝试获取数据 url 时,您的图像尚未加载。

    function encodeImageUri(imageUri, callback) {
        var c = document.createElement('canvas');
        var ctx = c.getContext("2d");
        var img = new Image();
        img.onload = function () {
            c.width = this.width;
            c.height = this.height;
            ctx.drawImage(img, 0, 0);
            var dataURL = c.toDataURL("image/jpeg");
            callback(dataURL);
        };
        img.src = imageUri;
    }
    

    然后改变另一个函数传递一个回调

    function onPhotoURISuccess(imageURI) {
        var largeImage = document.getElementById('smallImage');
        largeImage.style.display = 'block';
        largeImage.src = imageURI;
        encodeImageUri(imageURI, function(datauri){
          basestrg = datauri;
          //Now send the string to the server here.
        });
    
    }
    

    【讨论】:

    • 好的,它解决了黑盒图像,但是我从我的图像中得到了很大的 base64string,它不能传递给我的网络服务,有什么想法可以减少这个 base64strg 吗?
    • @prime 除非您压缩图像。 base64 字符串实际上是图像作为文本的二进制表示。非常粗略地说,Base64 编码的二进制数据的最终大小等于原始数据大小的 1.37 倍。所以如果你有一个 1MB 的文件,你会得到 1.37MB 的文本。我不知道你为什么不直接上传图片?
    • 我想直接上传图片但是我之前没有这样做过。知道我该如何开始吗?
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2014-02-09
    • 2016-06-04
    相关资源
    最近更新 更多