当图片大于矩形时,计算图片裁剪的坐标矩形
Calculate coordinates rectangle for picture cropping, when picture bigger than rectangle
我正在开发自己的图片查看器,并且正在创建图像裁剪方法。它确实适用于我当前的代码。但是,应用程序正在动态调整图像大小以适合用户屏幕。所以当它调整大小时,计算出的图像的X.Y坐标是不正确的。我数学不是很好,不知道怎么算。
这是我正在使用的代码
internal static Int32Rect GetCrop()
{
var cropArea = cropppingTool.CropTool.CropService.GetCroppedArea();
var x = Convert.ToInt32(cropArea.CroppedRectAbsolute.X);
var y = Convert.ToInt32(cropArea.CroppedRectAbsolute.Y);
var width = Convert.ToInt32(cropArea.CroppedRectAbsolute.Width);
var height = Convert.ToInt32(cropArea.CroppedRectAbsolute.Height);
return new Int32Rect(x, y, width, height);
}
cropArea
变量来自我自己修改的https://github.com/dmitryshelamov/UI-Cropping-Image版本。它是一个Rect
,returns X 和Y 坐标和宽度和高度来自用户绘制的正方形,用于select 裁剪图像区域。
我有调整图像宽度和高度的变量,以及图像的原始像素宽度和像素高度。裁剪 UI 使用调整大小的变量,以适合用户的屏幕。
为清楚起见,图像大小是这样计算的,图像控制设置为 Stretch.Fill
double width = sourceBitmap.PixelWidth;
double height = sourceBitmap.PixelHeight;
double maxWidth = Math.Min(SystemParameters.PrimaryScreenWidth - 300, width);
double maxHeight = Math.Min(SystemParameters.PrimaryScreenHeight - 300, height);
var aspectRatio = Math.Min(maxWidth / width, maxHeight / height);
width *= aspectRatio;
height *= aspectRatio;
image.Width = width;
image.Height = height;
所以问题是,如何计算渲染尺寸和实际像素尺寸之间的偏移量?
如果我理解这一点:您已经计算出一个名为 aspectRatio
的比率,用于将图像从实际大小缩放到屏幕大小。您有一个裁剪工具,可以根据 缩放后 大小的图像为您提供坐标,并且您想要转换这些坐标,以便将它们应用于图像的 原始 [=35] =]尺寸。
假设上面是正确的,这应该很简单。
如果缩放后的高度和宽度按以下方式计算:
scaledWidth = originalWidth * ratio
scaledHeigth = originalHeigth * ratio
那么你可以通过除法来反转乘法:
originalWidth = scaledWidth / ratio
originalHeight = scaledHeight / ratio
这也适用于图像中的任何坐标。您可以从缩放后的图像中获取坐标,并将它们转换为原始图像的坐标,如下所示:
originalX = scaledRect.X / ratio
originalY = scaledRect.Y / ratio
originalWidth = scaledRect.Width / ratio
originalHeight = scaledRect.Height / ratio
您必须小心确保 scaledRect
的值中 none 是 0
,因为除法和 0 不会混合。缩放坐标中的值 0
也将转换为原始坐标 space 中的 0
,因此 0
应该保持 0
。您可以使用 if
语句执行此操作。
我正在开发自己的图片查看器,并且正在创建图像裁剪方法。它确实适用于我当前的代码。但是,应用程序正在动态调整图像大小以适合用户屏幕。所以当它调整大小时,计算出的图像的X.Y坐标是不正确的。我数学不是很好,不知道怎么算。
这是我正在使用的代码
internal static Int32Rect GetCrop()
{
var cropArea = cropppingTool.CropTool.CropService.GetCroppedArea();
var x = Convert.ToInt32(cropArea.CroppedRectAbsolute.X);
var y = Convert.ToInt32(cropArea.CroppedRectAbsolute.Y);
var width = Convert.ToInt32(cropArea.CroppedRectAbsolute.Width);
var height = Convert.ToInt32(cropArea.CroppedRectAbsolute.Height);
return new Int32Rect(x, y, width, height);
}
cropArea
变量来自我自己修改的https://github.com/dmitryshelamov/UI-Cropping-Image版本。它是一个Rect
,returns X 和Y 坐标和宽度和高度来自用户绘制的正方形,用于select 裁剪图像区域。
我有调整图像宽度和高度的变量,以及图像的原始像素宽度和像素高度。裁剪 UI 使用调整大小的变量,以适合用户的屏幕。
为清楚起见,图像大小是这样计算的,图像控制设置为 Stretch.Fill
double width = sourceBitmap.PixelWidth;
double height = sourceBitmap.PixelHeight;
double maxWidth = Math.Min(SystemParameters.PrimaryScreenWidth - 300, width);
double maxHeight = Math.Min(SystemParameters.PrimaryScreenHeight - 300, height);
var aspectRatio = Math.Min(maxWidth / width, maxHeight / height);
width *= aspectRatio;
height *= aspectRatio;
image.Width = width;
image.Height = height;
所以问题是,如何计算渲染尺寸和实际像素尺寸之间的偏移量?
如果我理解这一点:您已经计算出一个名为 aspectRatio
的比率,用于将图像从实际大小缩放到屏幕大小。您有一个裁剪工具,可以根据 缩放后 大小的图像为您提供坐标,并且您想要转换这些坐标,以便将它们应用于图像的 原始 [=35] =]尺寸。
假设上面是正确的,这应该很简单。
如果缩放后的高度和宽度按以下方式计算:
scaledWidth = originalWidth * ratio
scaledHeigth = originalHeigth * ratio
那么你可以通过除法来反转乘法:
originalWidth = scaledWidth / ratio
originalHeight = scaledHeight / ratio
这也适用于图像中的任何坐标。您可以从缩放后的图像中获取坐标,并将它们转换为原始图像的坐标,如下所示:
originalX = scaledRect.X / ratio
originalY = scaledRect.Y / ratio
originalWidth = scaledRect.Width / ratio
originalHeight = scaledRect.Height / ratio
您必须小心确保 scaledRect
的值中 none 是 0
,因为除法和 0 不会混合。缩放坐标中的值 0
也将转换为原始坐标 space 中的 0
,因此 0
应该保持 0
。您可以使用 if
语句执行此操作。