我想送从相机拍摄到一台服务器作为一个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
你可以尝试增加图像质量。 我记得读,如果质量设置为低一些Android手机有问题。 我知道这是一个长镜头,但值得尝试:)
我相信的console.log有一个极限,它可以打印的字符数。 当您将数据作为一个图像标记喜欢的来源,会发生什么:
function onSuccess(imageData) {
var image = document.getElementById('myImage');
image.src = "data:image/jpeg;base64," + imageData;
}
此外,您还可以尝试将数据写入到一个文件。
我所面临的机器人同样的问题,有什么确切的问题,确保对方当我编码图像到其相应Base64
&如果图像尺寸更(2MB或更多...&还取决于图像质量和相机的质量,可取自200万像素或500万像素或800万像素是摄像头),那么它遇到的问题完整的图像转换为Base64的......你必须降低关注图像的大小! 我给我的工作Android code
,通过它我已经实现了it_
获取图像的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);
}
我希望这将帮助那些面临同样问题的其他哥们...谢谢!