我正在尝试编写一个方法,将base64字符串中的图像数据保存到二进制文件中,同时保留透明度(例如PNG)。
我的另一个要求是,这需要在PCL(可移植类库)中的C#中完成。
我知道您可以使用Image或WriteableBitmap来解决此问题,但这些类在PCL中不可用。
我有以下方法来完成获取base64数据并将其保存到文件的工作:
public static async Task Base64ToBinaryImageFile(IFile file, string base64Content)
{
var bytes = Convert.FromBase64String(base64Content);
using (var stream = await file.OpenAsync(FileAccess.ReadAndWrite))
{
stream.Seek(0, SeekOrigin.Begin);
using (var writer = new BinaryWriter(stream))
{
writer.Write(content);
writer.Flush();
}
}
}
除了:
之外,它的工作正常我丢失了透明度数据(因此透明像素显示为黑色)。
使用此方法创建的文件的大小(以字节为单位)比原始文件大。
了解原因是什么以及如何解决这些问题?
更新:以下是将base64数据发送到C#的JavaScript代码:
function onPaste(event) {
var $event = event.data.$;
var clipboardData = $event.clipboardData;
var found = false;
var imageType = /^image/;
if (!clipboardData) {
return false;
}
return Array.prototype.forEach.call(clipboardData.types, function (type, i) {
if (found) {
return false;
}
if (type.match(imageType) || clipboardData.items[i].type.match(imageType)) {
readImageAsBase64(clipboardData.items[i]);
return found = true;
}
return false;
});
}
function readImageAsBase64(item) {
if (!item || typeof item.getAsFile !== "function") {
return;
}
var file = item.getAsFile();
var reader = new FileReader();
reader.onload = function (evt) {
window.external.notify("pasteImageBase64/" + evt.target.result);
};
reader.readAsDataURL(file);
}
答案 0 :(得分:0)
我预见到一些可能的问题:
您的问题可能存在于来电者提供的base64Content
中。转换为base64Content
作为方法的输入可能是使用不正确的文件格式读取PNG图像。
与#1相关,调用该方法的人可能会使用.JPG或.BMP图像文件,天真地将其重命名为.PNG扩展名并调用您的方法,假设他们正在发送PNG图像,事实上他们不是。
您可能正在使用不支持透明度或处理良好的图像查看器/编辑器进行测试时打开.PNG图像(IE mspaint.exe)