C#-将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

我正在尝试编写一种方法,该方法以base64字符串形式获取图像数据,并将其保存到一个二进制文件,同时保持透明度(例如PNG)

我的另一个要求是,这需要在C#in PCL(可移植类库)中完成

我知道您可以使用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代码:


    我预见了几个可能的问题:

  • 您的问题可能存在于调用者提供的
    base64Content
    中。作为输入提供给您的方法的到
    base64Content
    的转换可能正在读取文件格式不正确的PNG图像

  • 与#1相关的是,可能有人调用该方法获取了一个.JPG或.BMP图像文件,天真地将其重命名为.PNG扩展名,并调用了您的方法,假设他们正在发送一个PNG图像,而实际上他们没有

  • 您可能正在使用不支持透明度或处理不好的图像查看器/编辑器(即mspaint.exe)在测试中打开.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);
    }