C#-将base64字符串保存到图像文件而不丢失透明度
我正在尝试编写一种方法,该方法以base64字符串形式获取图像数据,并将其保存到一个二进制文件,同时保持透明度(例如PNG) 我的另一个要求是,这需要在C#in PCL(可移植类库)中完成 我知道您可以使用Image或WriteableBitmap来解决此问题,但PCL中没有此类类 我使用以下方法获取base64数据并将其保存到文件中:C#-将base64字符串保存到图像文件而不丢失透明度,c#,image,base64,alpha-transparency,C#,Image,Base64,Alpha Transparency,我正在尝试编写一种方法,该方法以base64字符串形式获取图像数据,并将其保存到一个二进制文件,同时保持透明度(例如PNG) 我的另一个要求是,这需要在C#in PCL(可移植类库)中完成 我知道您可以使用Image或WriteableBitmap来解决此问题,但PCL中没有此类类 我使用以下方法获取base64数据并将其保存到文件中: public static async Task Base64ToBinaryImageFile(IFile file, string base64Conten
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代码:
我预见了几个可能的问题:
base64Content
中。作为输入提供给您的方法的到base64Content
的转换可能正在读取文件格式不正确的PNG图像此代码除了将图像数据保存到文件中之外,对图像数据不做任何处理。如果图像数据不是您想要的,则
base64Content
中的内容已经错误。base64编码的数据来自哪里?可能是从浏览器复制并粘贴的图像..?能否发布生成base64字符串的代码?我怀疑在创建base64内容时会发生丢失string@MattiVirkkunen:基本上我有一个WebView控件,它用JS托管HTML内容。当HTML页面内发生复制粘贴操作时,JS将启动并查看要粘贴的内容。如果是图像,JS将读取剪贴板的内容,并将其传递给C#code进行进一步处理。我只想先保存内容,以确保在进一步操作之前正确地将数据从JS发送到C#代码。就像我说的,它适用于所有没有透明度的图像(即使是没有透明度的PNG)。我已经用JS代码更新了原始问题。那将是web视图不支持粘贴透明图像。至少在我记忆中,这是webkit中的一个已知限制。您对此无能为力。请参阅上面的注释,了解base64Content的设置方式。至于上面的#2和#3,原始图像是一个带有一些透明像素的有效PNG图像(使用Paint.Net和Photoshop进行验证)。使用我的方法保存图像后,透明像素丢失(再次使用Paint.Net和Photoshop进行验证)
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);
}