【发布时间】:2011-06-27 01:15:27
【问题描述】:
我正在尝试做与链接问题相同的事情,但使用 C#。我正在显示一个缩放的图像,并允许用户选择要裁剪的区域。但是,我不能只从缩放的图像选择中获取 x1y1、x2y2 坐标并从原始图像中裁剪。我已经尝试像在另一个问题中那样做一些基本的数学运算,但这显然也不是正确的方法(它肯定更接近)。
编辑
原图尺寸:w = 1024 h = 768
缩放后的图像尺寸:w = 550 h = 412
我从一张图片开始,比如 1024x768。我希望它尽可能大地放入 550x550 的盒子中。我正在使用以下方法来获取缩放的图像大小(同时保持纵横比)。然后我对这些新尺寸进行基本调整。
对于选择区域,可以是 (0,0) 到 (100,100) 的任何值。
private static Rectangle MaintainAspectRatio(Image imgPhoto, Rectangle thumbRect)
{
int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; int destX = 0; int destY = 0;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)thumbRect.Width / (float)sourceWidth);
nPercentH = ((float)thumbRect.Height / (float)sourceHeight);
//if we have to pad the height pad both the top and the bottom
//with the difference between the scaled height and the desired height
if (nPercentH < nPercentW)
{
nPercent = nPercentH;
destX = (int)((thumbRect.Width - (sourceWidth * nPercent)) / 2);
}
else
{
nPercent = nPercentW;
destY = (int)((thumbRect.Height - (sourceHeight * nPercent)) / 2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Rectangle retRect = new Rectangle(thumbRect.X, thumbRect.Y, destWidth, destHeight);
return retRect;
}
【问题讨论】:
-
缩放图像的零在哪里?左上角还是左下角?
-
您使用变换(2x2 矩阵)缩放图像。您使用该矩阵的逆矩阵执行坐标转换。请提供原始图像大小、位置和转换后图像大小、位置的具体数值示例 - 这让一些人更容易这样想,而且消除了一些歧义。
-
这是 WPF 还是 Winfomrs?
-
@Conrad,它实际上在浏览器中。我正在使用 jquery 库在我的缩放图像上进行裁剪选择,并将其发送回服务器。
-
矩阵变换无法处理像素表示不是点表示这一事实。像素是用于表示一个点的矩形。在用户选择的 (top,left) 像素的情况下,所表示的点是该像素的 (top,left) POINT。在(底部,右侧)像素的情况下,像素代表像素的(底部,右侧)点。只有将一个像素点转化为一个点,矩阵变换才能成功。我觉得这很难简洁地解释,如果我错了,请看我的回答并击落我:)
标签: c# image-scaling