我有来自ng-src的base64data,但是我无法用这个base64data创建一个jpeg文件。我一直在尝试如下:
首先,我从data:image/jpeg:base64,
中删除了data:image/jpeg:base64,/9/DEefesdfae453/sdDFEYEUdfdief8fe ...
块,然后使用$cordovaFile
将该数据写入test.jpg文件。这是我的代码:
var base64Image = angular.element(document.querySelectorAll('#my-photo')).attr('src');
var writeData = base64Image.replace(/data:image\/jpeg;base64,/g, '');
alert(writeData);
// Writing filtered image -----------------------------------------------------------------
$cordovaFile.writeFile(ROOT_DIR + PM_DATA_DIR_NAME + '/', $scope.photo.name, writeData, true)
.then(function (success) {
// success
$ionicLoading.hide();
$ionicPopup.alert({
template : "Updated Photo!!"
});
}, function (error) {
// error
$ionicLoading.hide();
$ionicPopup.alert({
template : "Failed to update Photo!!"
});
});
但是我无法将文件显示为图像文件。它只显示黑屏。 (原始文件大小:19K --->结果文件大小:66K)
怎么了? 请帮我。 谢谢大家的帮助。
答案 0 :(得分:1)
FileWriter的write方法不带base64字符串。根据文档(http://docs.phonegap.com/en/edge/cordova_file_file.md.html#FileWriter),文本在编写之前将被编码为UTF-8。因此,在写入文件之前,您的base64字符串正在被编码,因此它不是有效的图像数据。您必须将图像数据作为Blob或ArrayBuffer传递。请注意,这仅适用于iOS和Android。在这个答案中看看Jeremy Banks的b64toBlob函数:https://stackoverflow.com/a/16245768
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
您可以将生成的blob传递给write方法。