C# - 将base64字符串保存到图像文件而不会失去透明度

时间:2016-08-18 19:00:03

标签: c# image base64 alpha-transparency

我正在尝试编写一个方法,将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();
        }
    }
}

除了:

之外,它的工作正常
  1. 我丢失了透明度数据(因此透明像素显示为黑色)。

  2. 使用此方法创建的文件的大小(以字节为单位)比原始文件大。

  3. 了解原因是什么以及如何解决这些问题?

    更新:以下是将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);
    }
    

1 个答案:

答案 0 :(得分:0)

我预见到一些可能的问题:

  1. 您的问题可能存在于来电者提供的base64Content中。转换为base64Content作为方法的输入可能是使用不正确的文件格式读取PNG图像。

  2. 与#1相关,调用该方法的人可能会使用.JPG或.BMP图像文件,天真地将其重命名为.PNG扩展名并调用您的方法,假设他们正在发送PNG图像,事实上他们不是。

  3. 您可能正在使用不支持透明度或处理良好的图像查看器/编辑器进行测试时打开.PNG图像(IE mspaint.exe)