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尺寸、坐标完全匹配时:
- 你设置的sourceRect尺寸(如500×500)未超出源图像边界(
200+500=700 < 1332,400+500=900 < 2000),SkiaSharp会按你设置的区域完整裁剪 - 无拉伸/压缩操作,裁剪后的图像直接绘制到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
相关产品推荐
相关产品推荐

