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设置动画