You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:24:03