Objective- C:在 UIImage 上绘制边框

Posted

技术标签:

【中文标题】Objective- C:在 UIImage 上绘制边框【英文标题】:Objective- C: Draw border on an UIImage 【发布时间】:2017-06-26 06:49:32 【问题描述】:

我目前正在尝试在以下图像上设置边框。它由一个UIImageView 和一个内部图像(transparent.png)组成

当我尝试为我的图像设置边框(参见代码)时,它为UIImage 提供了一个边框,但它不会“捕捉”我的图像。有没有可能达到这样的效果?

See image current implementation here.

- (UIImage*)imageWithBorderFromImage:(UIImage*)source;

  CGSize size = [source size];
  UIGraphicsBeginImageContext(size);
  CGRect rect = CGRectMake(0, 0, size.width, size.height);
  [source drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];

  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(context, 1.0, 0.5, 1.0, 1.0); 
  CGContextStrokeRect(context, rect);
  UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return testImg;
  

【问题讨论】:

看看这个:***.com/questions/1354811/…... 这很多都与普通正方形有关,但在底部有一个关于在有趣的周围创建边框的答案(意思是它不是方形/圆形等)图像/形状 您是如何创建/获取该图像的?你自己画的吗? @Larme 不,这是我从资产中添加的图像(透明 .png 图像) 然后,你要做边缘检测,找到透明的部分,并根据它进行描边。其他一些想法:***.com/questions/14902444/… 【参考方案1】:

尝试在 UIImageView 后面添加一个图层并为其添加一个边框来解决问题

#define kBorderWidth 3.0.   
#define kCornerRadius 8.0
CALayer *borderLayer = [CALayer layer];
CGRect borderFrame = CGRectMake(0, 0, (imageView.frame.size.width),    (imageView.frame.size.height));
[borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]];
[borderLayer setFrame:borderFrame];
[borderLayer setCornerRadius:kCornerRadius];
[borderLayer setBorderWidth:kBorderWidth];
[borderLayer setBorderColor:[[UIColor redColor] CGColor]];
[imageView.layer addSublayer:borderLayer];

别忘了导入 QuartzCore/QuartzCore.h

此示例将在图层上绘制一个边框,但稍微改变它的框架以使图层周围有边框。

【讨论】:

请检查我使用的图像。这只是为 UIImageView 添加了一个角半径,而不是图像本身【参考方案2】:

根据您的需要,如果您不希望它尽可能准确,一个快速而肮脏的解决方案可能是这样的:

- (UIImage *)borderedImageFromImage:(UIImage *)source andColor:(UIColor *)borderColor
    CGFloat scale = 0.95;//this determines how big the border will be, the smaller it is the bigger the border
    UIImage *borderImage = [source imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    UIGraphicsBeginImageContextWithOptions(source.size, NO, source.scale);
    [borderColor set];
    [borderImage drawInRect:CGRectMake(0, 0, source.size.width, source.size.height)];
    [source drawInRect:CGRectMake(source.size.width*(1-scale)/2,
                                  source.size.height*(1-scale)/2,
                                  source.size.width * scale,
                                  source.size.height * scale)];
    borderImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return borderImage;

这里是如何使用它:

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.heartImageView.image = [self borderedImageFromImage:[UIImage imageNamed:@"heart"] andColor:[UIColor blackColor]];


这实质上是绘制您想要的图像两次,一次使用边框颜色(略微缩放),一次使用正常颜色。您的里程可能会因图像而异。

【讨论】:

如何和原版一起使用?做一个 setImage 覆盖它,但使用你的函数本身什么都不做 UIImageview * imageview.image = [self borderedImageFromImage:source andColor:[UIColor blackColor]];

以上是关于Objective- C:在 UIImage 上绘制边框的主要内容,如果未能解决你的问题,请参考以下文章

Objective c 在转换为 UIImage 时丢失了 CIImage 内存

Objective C - 将 UIImage 保存为 BMP 文件

如何在Objective C中像Marquee Tag一样为UIImage设置动画

Objective C - 从这个 PaintCode 代码创建 UIImage

如何在objective-c中使UIImage为NULL

Objective c 图像集大小不失真