代码之家  ›  专栏  ›  技术社区  ›  TKoL

UWP-保存一个png为jpg,我希望透明度变成白色

  •  0
  • TKoL  · 技术社区  · 6 年前

    here 关于将画布保存为png。当我保存到png的时候效果很好,除了问题:背景是透明的,我希望它是白色的。

    我的第一个想法是尝试使用JPG编码,它会自动添加一个背景——我是对的!但它增加了一个黑色的背景。

    现在不幸的是,我似乎无法控制画布的制作,所以我不能只添加一个白色的背景。我在画布上查找文档,显然不能只在背景上添加白色-如果我可以只在画布上添加白色背景,请告诉我,因为这样可以解决我的问题。

    因此,唯一的解决方案是从下面的代码中提取我的PNG编码流,并用白色替换透明度。如果它可以在png而不是jpg中完成,我可以接受。如果只能在jpg上完成,我也可以。任何在这张图片上获得白色背景的方法。

    function saveCanvasAsImage(canvasElement) {
        var Imaging = Windows.Graphics.Imaging;
        var picker = new Windows.Storage.Pickers.FileSavePicker();
        picker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
        // picker.fileTypeChoices.insert("JPEG file", [".jpg"]);
        picker.fileTypeChoices.insert("PNG file", [".png"]);
        var fileStream, decoder, encoding, pixels = null;
    
    
        var encoderIds = {
            '.png': Imaging.BitmapEncoder.pngEncoderId,
            '.jpg': Imaging.BitmapEncoder.jpegEncoderId
        }
    
        var encoderId = encoderIds['.jpg'];
    
        var blob = canvasElement.msToBlob();
    
        return Imaging.BitmapDecoder.createAsync(Imaging.BitmapDecoder.pngDecoderId,
                blob.msDetachStream())
            .then(function (dc) {
                decoder = dc;
    
                return picker.pickSaveFileAsync();
            }).then(function (file) {
                if (file) {
                    encoderId = encoderIds[file.fileType];
                    return file.openAsync(Windows.Storage.FileAccessMode.readWrite);
                } else {
                    return WinJS.Promise.wrapError("No file selected");
                }
            }).then(function(stream) {
                fileStream = stream;
    
                var transform = new Windows.Graphics.Imaging.BitmapTransform();
    
                return decoder.getPixelDataAsync(
                    decoder.bitmapPixelFormat,
                    decoder.bitmapAlphaMode,
                    transform,
                    Windows.Graphics.Imaging.ExifOrientationMode.respectExifOrientation,
                    Windows.Graphics.Imaging.ColorManagementMode.colorManageToSRgb
                );
    
            }).then(function (pixelProvider) {
    
                pixels = pixelProvider.detachPixelData();
    
                return Imaging.BitmapEncoder.createAsync(encoderId, fileStream);
            }).then(function (encoder) {
                encoding = decoder;
                //Set the pixel data--assume "encoding" object has options from elsewhere
                encoder.setPixelData(encoding.bitmapPixelFormat, encoding.bitmapAlphaMode,
                    encoding.pixelWidth, encoding.pixelHeight, encoding.dpiX, encoding.dpiY,
                    pixels);
                //Go do the encoding
                return encoder.flushAsync();
            }).done(function () {
                //Make sure to do this at the end
                fileStream.close();
            }, function () {
                //Empty error handler (do nothing if the user canceled the picker
            });
    }
    
    0 回复  |  直到 6 年前