UIImage的圆角(UIImage with rounded corners)

2019-06-24 08:57发布

我已经看过几个职位。 而几乎每个人都建议使用QuartzCore/QuartzCore.hlayer.cornerRadius

我曾尝试这种方法和一些方法。

那么,当图像不动,一切工作正常。

但是,在我的项目,我总是将我的图片。 如果我添加圆角半径或阴影的图像运动不再光滑。 它看起来aweful!

这就是我调整我的形象的方式:

CGSize newSize = CGSizeMake(200*height/image.size.height, 280);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(nil, newSize.width, newSize.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGContextClearRect(context, CGRectMake(0, 0, newSize.width, newSize.height));
CGContextDrawImage(context, CGRectMake(0, 0, newSize.width, newSize.height), image.CGImage);
CGImageRef scaledImage = CGBitmapContextCreateImage(context);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
UIImage *newImage = [UIImage imageWithCGImage: scaledImage];
CGImageRelease(scaledImage);

我想知道,以调整图片的大小的好方法,添加阴影,圆角半径,仍然有我的形象的平滑移动。

Answer 1:

// Get your image somehow
UIImage *image = [UIImage imageNamed:@"image.jpg"];

// Begin a new image that will be the new image with the rounded corners 
// (here with the size of an UIImageView)
 UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);

 // Add a clip before drawing anything, in the shape of an rounded rect
  [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds 
                        cornerRadius:10.0] addClip];
 // Draw your image
[image drawInRect:imageView.bounds];

 // Get the image, here setting the UIImageView image
  imageView.image = UIGraphicsGetImageFromCurrentImageContext();

 // Lets forget about that we were drawing
  UIGraphicsEndImageContext();

尝试使用此代码移动,据我记得我用这个了一段时间后,使图像圆角,你可以移动到目标。 但它似乎规模细...



Answer 2:

罗汉的答案是一个伟大的。 如果有人有重构在他们的项目,在这里工作的任何probs是一个整洁的重构,可能希望能帮助一些较新的程序员:

+ (UIImage *)imageWithRoundedCornersSize:(float)cornerRadius usingImage:(UIImage *)original
{    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:original];

    // Begin a new image that will be the new image with the rounded corners
    // (here with the size of an UIImageView)
    UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);

    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:imageView.bounds
                            cornerRadius:cornerRadius] addClip];
    // Draw your image
    [original drawInRect:imageView.bounds];

    // Get the image, here setting the UIImageView image
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

    return imageView.image;
}


Answer 3:

还有就是查理·塞利格曼的解决方案更优化的内存版本。 你不需要使用的UIImageView用于这一目的。

+ (UIImage *)imageWithRoundedCornersSize:(float)cornerRadius usingImage:(UIImage *)original
{
    CGRect frame = CGRectMake(0, 0, original.size.width, original.size.height);

    // Begin a new image that will be the new image with the rounded corners
    // (here with the size of an UIImageView)
    UIGraphicsBeginImageContextWithOptions(original.size, NO, original.scale);

    // Add a clip before drawing anything, in the shape of an rounded rect
    [[UIBezierPath bezierPathWithRoundedRect:frame
                                cornerRadius:cornerRadius] addClip];
    // Draw your image
    [original drawInRect:frame];

    // Get the image, here setting the UIImageView image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // Lets forget about that we were drawing
    UIGraphicsEndImageContext();

    return image;
}

您可以通过指定两次cornerRadius等于增加图像尺寸得到全面的图像(image.size.width * 2)。



Answer 4:

尝试娄代码导入后的文件#进口在.m文件

  yourImageView.layer.shadowColor=[[UIColor grayColor] CGColor];
  yourImageView.layer.cornerRadius = 8;
  yourImageView.layer.shadowOffset=CGSizeMake(2, 2);
  yourImageView.layer.shadowOpacity=1.0;
  yourImageView.layer.shadowRadius=1.0;

希望,这帮助你....



Answer 5:

如果动画图像位置时,性能比较差,可能是因为它不必渲染与圆角半径每帧的图像。 这是必然的,如果图像后面有没有一个固体颜色(即“共混”是在每个帧中不同,因此,必须计算)。 如果不是这种情况,你可以得到的背景是纯色的,请务必设置UIView.backgroundColor比clearColor其他的东西,有一个alpha 1.0。 同时栅格化图层可以帮助你(它会在内存中存储的渲染层的缓存版本,并使用在整个动画。但同样,如果该层是透明的也无济于事)。

这是你如何做到这一点:

UIView *yourView;
CALayer *yourLayer = yourView.layer;

yourLayer.shouldRasterize = YES;
yourLayer.rasterizationScale = [UIScreen mainScreen].scale;


Answer 6:

设置在Objective-C图像上的圆角:

yourImageView.layer.cornerRadius = yourRadius;                                   

yourImageView.clipsToBounds = YES;                                 


Answer 7:

对的,这是可能的。

导入QuartzCore(#进口)报头和与所述的UIImageView的层属性播放。

ImageView.layer.cornerRadius = Radius;
ImageView.clipsToBounds = YES;


文章来源: UIImage with rounded corners