给定任意尺寸的UIImage图像,我希望生成一个正方形的“图标”大小版本,每边大小为
首先,给定一个UIImage
现在我们有一个宽62.5像素,高50像素的矩形来使用,并且有一个裁剪矩形抓取中间的50x50部分。
接下来是最后一步!接下来,我们设置图像上下文,将UIImage(这里称为myImage)绘制到矩形中,设置裁剪矩形,获取(可能已被裁剪的)图像,使用它,最后清理我们的图像上下文。
px
像素,无任何扭曲(拉伸)。然而,我遇到了一个小问题。不太确定问题出在哪里。这是我到目前为止所做的事情。首先,给定一个UIImage
size
,我确定三件事:缩小图像时使用的比例;一个delta
(我们希望的图标尺寸与最长边之间的差异),以及一个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.5像素,高50像素的矩形来使用,并且有一个裁剪矩形抓取中间的50x50部分。
接下来是最后一步!接下来,我们设置图像上下文,将UIImage(这里称为myImage)绘制到矩形中,设置裁剪矩形,获取(可能已被裁剪的)图像,使用它,最后清理我们的图像上下文。
UIGraphicsBeginImageContext(rect.size);
[myImage drawInRect:rect];
UIRectClip(clipRect);
UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();
// Do something with the icon here ...
UIGraphicsEndImageContext();
只有一个问题:裁剪从未发生过!最终我得到的是一张63像素宽,50像素高的图片。:(
也许我误用/误解了 UIRectClip ?我尝试调整各种事物:交换 rect
和 clipRect
的使用,将 UIRectClip 移动到 drawInRect: 之前。但都没有成功。
我还尝试在网上搜索这个方法的示例,但没有找到。对于记录,UIRectClip 的定义如下:
通过与指定矩形相交来修改当前剪切路径。
调整一些东西可以让我们更接近目标:
UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];
现在我们没有失真了,但是剪切的图像并没有如我所预期的那样居中于原始图像。不过,至少这个图像是50x50的,尽管由于上述混乱导致变量名现在被弄乱了。(我会尊重地让读者自己来重命名。)