Xamarin使用SkiaSharp导出Jpeg时如何将默认黑色背景改为白色
解决SkiaSharp导出JPG自动填充黑底问题
你可以在编码JPG前,手动将带透明通道的位图合并到白色背景层上,彻底消除透明通道即可解决黑底问题,修改后的代码如下:
SKBitmap originalSignature = SKBitmap.Decode(canvasImg.Encode()); // 生成和原图尺寸一致的不透明白底位图 SKBitmap whiteBgBitmap = new SKBitmap( originalSignature.Width, originalSignature.Height, SKColorType.Rgb888x, SKAlphaType.Opaque ); // 绘制白底+原签名内容 using (SKCanvas tempCanvas = new SKCanvas(whiteBgBitmap)) { tempCanvas.Clear(SKColors.White); tempCanvas.DrawBitmap(originalSignature, 0, 0); } // 后续导出逻辑不变 using (var image = SKImage.FromBitmap(whiteBgBitmap)) using (var data = image.Encode(SKEncodedImageFormat.Jpeg, 80)) { string saveDir = Path.Combine(PCLStorage.FileSystem.Current.LocalStorage.Path, "work\\Models"); // 避免目录不存在报错,可自行加上目录存在性判断 Directory.CreateDirectory(saveDir); using (var streamSign = File.OpenWrite(Path.Combine(saveDir, "signature.jpg"))) { data.SaveTo(streamSign); } } // 手动释放位图资源避免内存泄漏 originalSignature.Dispose(); whiteBgBitmap.Dispose();
说明
- JPG格式本身不支持透明通道,SkiaSharp编码时会默认将透明区域填充为黑色,合并白背景的操作完全兼容UWP和后续要适配的Android平台,不需要额外调整跨端逻辑。
- 如果你能调整画布绘制的前置逻辑,也可以在最开始绘制内容前就给画布先填充一层白色背景,省去后续二次处理的步骤,性能更好。
内容的提问来源于stack exchange,提问作者Drakyn_
相关产品推荐
相关产品推荐

