Я задал предыдущий вопрос здесь о сохранении canvas в 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
});
}