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

SkiaSharp Canvas.DrawBitmap裁剪异常问题咨询

SkiaSharp Canvas.DrawBitmap 裁剪异常原因分析

核心问题:SourceRect 超出源图像边界被自动截断

你的源图像尺寸为2000×1332,而代码中设置的sourceRect = SKRect.Create(400, 200, 1500, 1500)存在边界越界:

  • 宽度方向:400 + 1500 = 1900,小于源图像宽度2000,这部分有效
  • 高度方向:200 + 1500 = 1700,远大于源图像高度1332,此时SkiaSharp会自动将sourceRect的底部边界截断为源图像的底部(y=1332),实际有效裁剪高度仅为1332 - 200 = 1132

当这个被截断的区域(400,200,1900,1332)被拉伸到1080×1080的destRect时,图像会被垂直压缩,视觉上和你设置较小sourceRect(如500×500,未越界)拉伸后的效果高度相似,导致你误以为显示区域未变化。

为何destRect与sourceRect尺寸一致时显示正常?

当destRect和sourceRect尺寸、坐标完全匹配时:

  1. 你设置的sourceRect尺寸(如500×500)未超出源图像边界(200+500=700 < 1332,400+500=900 < 2000),SkiaSharp会按你设置的区域完整裁剪
  2. 无拉伸/压缩操作,裁剪后的图像直接绘制到destRect,你能看到准确的预期区域,不会有视觉混淆

验证与修复方案

  • 快速验证:修改sourceRect的高度为1132(即源图像高度减去起始y坐标),代码如下:

    SKRect sourceRect = SKRect.Create(400, 200, 1500, 1132);
    

    此时绘制到1080×1080的destRect,就能看到预期的裁剪区域被拉伸显示。

  • 通用修复:在设置sourceRect前,手动校验并截断超出边界的部分,避免自动截断导致的意外:

    float startX = 400;
    float startY = 200;
    float targetW = 1500;
    float targetH = 1500;
    
    // 计算实际可裁剪的最大宽高
    float actualW = Math.Min(targetW, sourceMap.Width - startX);
    float actualH = Math.Min(targetH, sourceMap.Height - startY);
    
    SKRect sourceRect = SKRect.Create(startX, startY, actualW, actualH);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:55:03