正确使用 UIRectClip 将 UIImage 缩小到图标大小

2024-02-03

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,尽管变量名称现在由于上述改组而变得混乱。 (我将恭敬地将重命名作为读者的练习。)


尤里卡!我的事情有点混乱。这有效:

CGRect clipRect = CGRectMake(-offset.x, -offset.y,
                             (ratio * size.width) + delta,
                             (ratio * size.height) + delta);
UIGraphicsBeginImageContext(CGSizeMake(px, px));
UIRectClip(clipRect);
[myImage drawInRect:clipRect];
UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();

// Do something with the icon here ...

UIGraphicsEndImageContext();

不再需要rect。这个技巧似乎是使用negative剪切矩形中的偏移量,从而对齐我们想要抓取 50 x 50 图像的原点(在本例中)。

也许有更简单的方法。如果是的话,请权衡一下!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确使用 UIRectClip 将 UIImage 缩小到图标大小 的相关文章

随机推荐