将其剪辑成圆形后质量低的 UIImage

Low quality UIImage after clipping it to a circle

我正在尝试剪辑 UIImage 使其成为圆形,我从 140*140px 图像开始,然后 运行 此代码:

 //round the image

    UIImageView *roundView = [[UIImageView alloc] initWithImage:smallImage];
    UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, 1.0);
    [[UIBezierPath bezierPathWithRoundedRect:roundView.bounds
                                cornerRadius:roundView.frame.size.width/2] addClip];
    [smallImage drawInRect:roundView.bounds];
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    smallImage = finalImage;

    //end round image

效果不错,但质量很差,图像看起来很模糊,圆圈周围的边缘参差不齐。我想达到与以下相同的效果:

image.layer.cornerRadius = self.thumbnailView.frame.size.width / 2;
image.clipsToBounds = YES;

不知道为什么图像质量这么低。有人可以给我一些指示吗?

您将错误的比例传递给 UIGraphicsBeginImageContextWithOptions。您正在传递 1。使用 UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, [UIScreen mainScreen].scale);

您可能希望将比例保持在 0.f,以便与设备比例相匹配(视网膜/非视网膜)。

UIGraphicsBeginImageContextWithOptions(roundView.bounds.size, NO, 0.f);

你也可以像这样画一个圆:

UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.f);
CGRect interiorBox = CGRectInset(rect, 0.f, 0.f);
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithOvalInRect:insideBox];
[bezierPath addClip];
[image drawInRect:rect];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

您确定确实需要对实际图像执行此操作吗?仅仅使图像视图变圆还不够吗?

你可以很容易地做到这一点。

UIImageView *imageView = // your image view with the image
imageView.frame = CGRectMake(0, 0, 140, 140); // the size you want
imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.layer.cornerRadius = 70; // make the corner radius half of the size

这将显示您的图像被图像视图裁剪成一个圆圈。

图像保持不变。只是图片的显示是四舍五入的。

它也更便宜(时间和内存)。

在 table 中执行此操作不会减慢速度。您只需为每个出列的单元格执行一次。对于重复使用的单元格,您不需要执行此操作,因为它是在首次创建单元格时完成的。