Given a UIImage任何尺寸,我希望生成一个方形“图标”大小的版本,px
像素到一侧,没有任何扭曲(拉伸)。然而,我遇到了一个小障碍。不太确定问题出在哪里。这就是我到目前为止正在做的事情。
首先,给定一个UImage size
,我确定三件事:ratio
缩小图像时使用; Adelta
(我们想要的图标大小和最长边之间的差异),以及offset
(用于在剪切图像时计算出原点坐标):
if (size.width > size.height) {
ratio = px / size.width;
delta = (ratio*size.width - ratio*size.height);
offset = CGPointMake(delta/2, 0);
} else {
ratio = px / size.height;
delta = (ratio*size.height - ratio*size.width);
offset = CGPointMake(0, delta/2);
}
现在,假设您有一个宽 640 像素、高 480 像素的图像,我们想从中获得一个 50 像素 x 50 像素的图标。宽度大于高度,所以我们的计算是:
ratio = 50px / 640px = 0.078125
delta = (ratio * 640px) - (ratio * 480px) = 50px - 37.5px = 12.5px
offset = {x=6.25, y=0}
接下来,我创建一个CGRect rect
它足够大,可以裁剪到我们想要的图标大小而不会失真,再加上clipRect
用于剪辑目的:
CGRect rect = CGRectMake(0.0, 0.0, (ratio * size.width) + delta,
(ratio * size.height) + delta);
CGRect clipRect = CGRectMake(offset.x, offset.y, px, px);
代入上面的值,我们得到:
rect = origin {x=0.0, y=0.0}, size {width=62.5, height=50.0}
clipRect = origin {x=6.25, y=0}, size {width=50.0, height=50.0}
现在我们有一个 62.5px 宽 x 50px 高的矩形可以使用,还有一个剪切矩形可以抓取“中间”50x50 的部分。
冲刺冲刺!接下来,我们设置图像上下文,绘制UIImage(称为myImage
这里)进入矩形,设置剪切矩形,获取(可能是现在剪切的)图像,使用它,最后清理我们的图像上下文:
UIGraphicsBeginImageContext(rect.size);
[myImage drawInRect:rect];
UIRectClip(clipRect);
UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();
// Do something with the icon here ...
UIGraphicsEndImageContext();
只有一个问题:剪辑永远不会发生!我最终得到了一张 63 像素宽 x 50 像素高的图像。:(
也许我误用/误解了UI矩形剪辑?我尝试过改变各种事情:交换使用rect
and clipRect
, 移动UI矩形剪辑 before 绘制矩形:。没有骰子。
我也尝试在网上搜索此方法的示例,但无济于事。作为记录,UI矩形剪辑定义为:
修改当前剪切路径
与指定的相交
长方形。
打乱事情的顺序让我们更接近一些:
UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];
现在我们没有失真,但剪切后的图像并不像我预期的那样以原始图像为中心。尽管如此,至少图像是 50x50,尽管变量名称现在由于上述改组而变得混乱。 (我将恭敬地将重命名作为读者的练习。)