1

我想将从相机拍摄的照片作为 base64 字符串发送到服务器。我的问题是图片在手机中以某种方式损坏。

我有一些console.logs在camera.getPicture的成功函数中打印base64字符串,每当我打印字符串和解码图像时,它只显示顶部,就好像它不完整一样。

这是我的代码:

photo.capturePhoto = function(image_button_id) {
        navigator.camera.getPicture(function(image) {
            photo.onPhotoDataSuccess(image)
        }, onFail, {
            quality : 30,
            destinationType: destinationType.DATA_URL,
            correctOrientation : true
        });
    }

和成功功能:

photo.onPhotoDataSuccess = function(image) {
        console.log(image); //What this prints is an incomplete image when decoded
    }

这段代码有什么问题?

这是解码时的示例图像:http ://www.freeformatter.com/base64-encoder.html 在此处输入图像描述

我正在使用 phonegap 2.2.0

4

3 回答 3

0

您可以尝试提高图像质量吗?如果质量设置为低,我记得读过一些安卓手机会出现问题。我知道这是一个远射但值得一试:)

于 2013-01-14T16:43:09.773 回答
0

我相信 console.log 对它可以打印的字符数有限制。当您将数据设置为图像标签的来源时会发生什么,例如:

function onSuccess(imageData) {
    var image = document.getElementById('myImage');
    image.src = "data:image/jpeg;base64," + imageData;
}

此外,您可能想尝试将数据写入文件。

于 2013-01-14T17:17:59.327 回答
0

我在android中遇到了同样的问题,确切的问题是什么_当我将图像编码为其对应Base64的&如果图像大小更大(2mb或更多......&也取决于图像质量和相机质量,可能取自2MP或 5MP 或可能是 8MP 相机)然后将完整图像转换为 Base64 会遇到问题...您必须减小关注图像的大小!我已经完成了我的工作Android code_
获取 Base64 图像字符串

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Bitmap mBitmap= new decodeFile("<PATH_OF_IMAGE_HERE>");
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();
        int i=b.length;
        String base64ImageString=android.util.Base64.encodeToString(b, 0, i, android.util.Base64.NO_WRAP);

转换为正确的位图

       /**
        *My Method that reduce the bitmap size.
        */
        private Bitmap decodeFile(String  fPath){

        //Decode image size
        BitmapFactory.Options opts = new BitmapFactory.Options();
        //opts.inJustDecodeBounds = true;
        opts.inDither=false;                     //Disable Dithering mode
        opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        opts.inTempStorage=new byte[1024]; 

        BitmapFactory.decodeFile(fPath, opts);

        //The new size we want to scale to
        final int REQUIRED_SIZE=70;//or vary accoding to your need...

        //Find the correct scale value. It should be the power of 2.
        int scale=1;
        while(opts.outWidth/scale/2>=REQUIRED_SIZE && opts.outHeight/scale/2>=REQUIRED_SIZE)
            scale*=2;

        //Decode with inSampleSize
         opts.inSampleSize=scale;

        return BitmapFactory.decodeFile(fPath, opts);

   } 

我希望这会帮助其他面临同样问题的朋友......谢谢!

于 2013-01-19T07:34:15.253 回答