将其剪辑成圆形后质量低的 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 中执行此操作不会减慢速度。您只需为每个出列的单元格执行一次。对于重复使用的单元格,您不需要执行此操作,因为它是在首次创建单元格时完成的。
我正在尝试剪辑 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 中执行此操作不会减慢速度。您只需为每个出列的单元格执行一次。对于重复使用的单元格,您不需要执行此操作,因为它是在首次创建单元格时完成的。