C# WPF图片查看器计算缩放平移后图片的裁剪矩形方法
WPF缩放平移场景下裁剪区域计算方案
要将缩放、平移变换纳入裁剪计算,核心是对屏幕采集的裁剪坐标做逆变换,还原为未做变换前的适配图像坐标,再映射到原始图像像素坐标即可,具体实现如下:
核心计算逻辑
你当前采集的cropArea.CroppedRectAbsolute是屏幕坐标系下的坐标,需要先抵消平移和缩放的影响:
- 读取你的变换参数:从
ScaleTransform读取缩放系数(均匀缩放时ScaleX与ScaleY一致),从TranslateTransform读取X/Y方向的平移偏移量 - 对裁剪区坐标做逆变换:裁剪区坐标先减去平移偏移量,再除以缩放系数,得到未做缩放平移的适配后图像坐标
- 继续沿用你原有的宽高比映射、旋转适配逻辑,即可得到原始图像上的正确裁剪区域
完整实现代码
internal static Int32Rect? GetCrop() { var cropArea = CropService.GetCroppedArea(); if (cropArea == null) { return null; } // 读取缩放平移变换参数,此处替换为你实际全局存储的变换实例变量即可 double scale = yourScaleTransformInstance.ScaleX; double offsetX = yourTranslateTransformInstance.X; double offsetY = yourTranslateTransformInstance.Y; // 逆变换得到适配后图像的原始坐标 double adjustedX = (cropArea.CroppedRectAbsolute.X - offsetX) / scale; double adjustedY = (cropArea.CroppedRectAbsolute.Y - offsetY) / scale; double adjustedWidth = cropArea.CroppedRectAbsolute.Width / scale; double adjustedHeight = cropArea.CroppedRectAbsolute.Height / scale; // 映射到原始图像像素坐标 int x = Convert.ToInt32(adjustedX / AspectRatio); int y = Convert.ToInt32(adjustedY / AspectRatio); int width, height; switch (Rotateint) // 适配图像旋转角度 { case 0: case 180: width = Convert.ToInt32(adjustedWidth / AspectRatio); height = Convert.ToInt32(adjustedHeight / AspectRatio); break; default: width = Convert.ToInt32(adjustedHeight / AspectRatio); height = Convert.ToInt32(adjustedWidth / AspectRatio); break; } // 越界防护,避免参数非法报错 x = Math.Max(0, x); y = Math.Max(0, y); width = Math.Min(OriginalImagePixelWidth - x, width); height = Math.Min(OriginalImagePixelHeight - y, height); return new Int32Rect(x, y, width, height); }
注意:代码中的
yourScaleTransformInstance、yourTranslateTransformInstance需要替换为你实际代码中存储缩放、平移变换对象的变量名,OriginalImagePixelWidth、OriginalImagePixelHeight替换为原始图像的像素宽高变量。
裁剪效果示例

内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

