iOS下实现图片加文字(缩放&旋转)

最近有一个需求是要在图片上加文字,第三方实现的很多,但是不想用SDK.打算用代码自己写.
最初的方案是自己在画布上绘制,记录用户的旋转角度和缩放倍数,计算文字的位置,然后依次绘制到CGContext上.下边是基本代码.
但是这个实现方式有一个问题就是位置需要精确计算.并且因为进行了transform之后.UIView的frame整体值是有问题的.x值不是左上角,而是最靠左侧点的位置.y值为最靠上点的位置.导致整个坐标系需要进行计算.并且容易出错.

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
        //等比例缩放的话这里宽高都可以
        CGFloat fltImageScale = self.imagePanle.image.size.width / self.imagePanle.width;
        CGFloat fltTextScale = lblText.scale;
        NSDictionary *dicAttribute = @{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont fontWithName:DP_FONTNAME size:17 * fltTextScale * fltImageScale],NSParagraphStyleAttributeName:paragraphStyle};
        
        CGPoint textOrigin = [lblText convertPoint:CGPointZero toView:lblText.superview];
        textOrigin = CGPointMake(textOrigin.x * fltImageScale, textOrigin.y * fltImageScale);
        CGSize textSize = CGSizeMake(lblText.bounds.size.width * lblText.scale * fltImageScale, lblText.bounds.size.height * lblText.scale * fltImageScale);
        CGRect textRect = CGRectMake(textOrigin.x, textOrigin.y, textSize.width, textSize.height);
        
        
        //旋转角度
        CGFloat fltRotate = lblText.angle;
        
        
        //      [lblText.text drawInRect:textRect withAttributes:dicAttribute];
        
        
        CGPoint translateOrignal =CGPointMake(textOrigin.x + textSize.width * 0.5,textOrigin.y + textSize.height * 0.5);
        textOrigin = CGPointMake(-textSize.width * 0.5,-textSize.height * 0.5);
        
        textRect.origin = CGPointMake(textOrigin.x, textOrigin.y);
        
        CGContextTranslateCTM(context, translateOrignal.x,translateOrignal.y);
        CGContextRotateCTM(context,radians(fltRotate));
        
        [lblText.text drawInRect:textRect withAttributes:dicAttribute];
        
        //复原
        CGContextRotateCTM(context,radians(-fltRotate));
        CGContextTranslateCTM(context, -translateOrignal.x,-translateOrignal.y);

最后的实现方式是在页面上加了一个UIView,放置所有添加的UILable,在生成图时选择先绘制背景图,然后将UIView生成一个图片直接追加上去,不需要进行位置的计算.唯一的一个需要注意的点就是CGContext的大小和位置问题.我这里选择使用image和它所在的UIImageView的缩放比例作为CGContext的scale使用.

CGFloat fltImageScale = self.image.size.width / self.imageView.bounds.size.width;
    UIGraphicsBeginImageContextWithOptions(self.viewTextPanle.size, NO,fltImageScale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.image drawInRect:self.viewTextPanle.bounds];
    [self.viewTextPanle.layer renderInContext:context];
    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    while (self.viewTextPanle.subviews.firstObject) {
        [self.viewTextPanle.subviews.firstObject removeFromSuperview];
    }
    self.imageView.image = resultImage;

有些功能实现起来很复杂.但是换一个思路其实特别简单,这里将自己的坑写出来,希望能帮助到其他人

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,228评论 3 119
  • 纵然他说“我养你啊”是最感人的情话。 但是,作为女人,你可以依靠,但不能依赖。 愿有人养你,你也能自己养自己
    顾世芳阅读 240评论 0 0
  • 本文参与#漫步青春#征文活动,作者胡雨鑫,本人承诺,文章内容为原创,且未在其他平台发布 ...
    Y金金金阅读 334评论 0 0
  • 取标题时弄清第三人称视角 第三人称视角是上帝视角,是不带任何感情色彩和主观意识的,是纯粹的局外人旁观者。 标题里,...
    没合同的苦阅读 986评论 0 0

友情链接更多精彩内容