gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:39:08 25 4
gpt4 key购买 nike

给定任何尺寸的 UIImage ,我希望生成一个方形“图标”大小的版本,一侧为 px 像素,没有任何扭曲(拉伸(stretch))。然而,我遇到了一个小障碍。不太确定问题出在哪里。这就是我到目前为止正在做的事情。

首先,给定一个 UImage size,我确定三件事:缩小图像时使用的ratiodelta(我们想要的图标大小和最长边之间的差异)和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 像素高的图像。 :(

也许我误用/误解了UIRectClip?我尝试过调整各种内容:交换 rectclipRect 的使用,在 drawInRect: 之前移动 UIRectClip 。没有骰子。

我也尝试在网上搜索此方法的示例,但无济于事。根据记录,UIRectClip 定义为:

Modifies the current clipping path by intersecting it with the specified rectangle.

重新排列事物可以让我们更接近:

UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];

现在我们没有失真,但剪切后的图像并不像我预期的那样以原始图像为中心。尽管如此,至少图像是 50x50,尽管变量名称现在由于上述改组而变得困惑。 (我将恭敬地将重命名作为读者的练习。)

最佳答案

Eureka !我的事情有点困惑。这有效:

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。技巧似乎是在剪切矩形中使用偏移量,从而对齐我们想要抓取 50 x 50 图像的原点(在本例中)。

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

关于iphone - 正确使用 UIRectClip 将 UIImage 缩小到图标大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1405994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com