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

C# SkiaSharp:如何获取流中图片的SKEncodedImageFormat并保持原格式?

使用SkiaSharp处理未知格式图片并保留原格式返回

核心问题解答

  • 思路正确性:你的思路完全正确。SkiaSharp在解码图片(将字节数组转为SKImage/SKBitmap)后,会丢失原始图片的格式信息,因此必须在解码操作前先提取原始格式,才能在输出时使用相同格式编码。
  • 获取图片格式的方法:无法直接从SKImage或SKBitmap中获取原始格式,因为它们是解码后的光栅化图像数据。正确的做法是使用SKCodec从原始字节流中解析格式:
    • 用原始字节流创建SKCodec实例
    • 通过SKCodec.EncodedFormat属性获取原始格式

修正后的完整代码

using SkiaSharp;
using System.IO;

public byte[] ManipulateImage(byte[] bytes)
{
    // 步骤1:先从原始字节流中提取图片格式
    SKEncodedImageFormat originalFormat;
    using (var originalStream = new MemoryStream(bytes))
    {
        using var codec = SKCodec.Create(originalStream);
        originalFormat = codec.EncodedFormat;
        // 重置流位置,因为SKCodec读取过流
        originalStream.Seek(0, SeekOrigin.Begin);
    }

    // 步骤2:解码图片为SKImage进行处理
    using var inputStream = new MemoryStream(bytes);
    // 普通位图格式无需ToRasterImage,矢量图场景才需要
    using var skImage = SKImage.FromEncodedData(inputStream);
    
    // 创建画布用于叠加操作
    using var surface = SKSurface.Create(skImage.Info);
    var canvas = surface.Canvas;
    
    // 绘制原始图片到画布
    canvas.DrawImage(skImage, 0, 0);

    // 步骤3:叠加另一张图片的示例(按需启用)
    // using var overlayStream = new MemoryStream(overlayBytes);
    // using var overlayImage = SKImage.FromEncodedData(overlayStream);
    // canvas.DrawImage(overlayImage, new SKRect(10, 10, overlayImage.Width + 10, overlayImage.Height + 10));

    // 步骤4:使用原始格式编码处理后的图片
    using var outputMemoryStream = new MemoryStream();
    using var processedImage = surface.Snapshot();
    using var skData = processedImage.Encode(originalFormat, 100);
    skData.AsStream().CopyTo(outputMemoryStream);

    return outputMemoryStream.ToArray();
}

关键细节说明

  • SKImage vs SKBitmap:如果只是绘图、叠加等操作,用SKImage更高效;SKBitmap适用于像素级修改场景,大部分业务场景SKImage足够。
  • ToRasterImage的使用:仅当原始图片是SVG等矢量格式时才需要调用,普通位图(PNG/JPG等)直接用FromEncodedData返回的SKImage即可。
  • 编码质量参数:Encode方法的第二个参数(0-100)仅对有损格式(如JPG)生效,无损格式(如PNG)会自动忽略该参数。

内容的提问来源于stack exchange,提问作者Nikjw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:52