美文网首页ios开发
图片处理方法(截取、马赛克、拉伸)

图片处理方法(截取、马赛克、拉伸)

作者: 深圳张学友 | 来源:发表于2017-10-17 11:58 被阅读101次

图片拉伸处理

实现类似Android中点9图的效果,拉伸图片不造成变形且不降低图片清晰度.

图片拉伸
主要使用image的resizableImageWithCapInsets方法实现,设置你想要保留的图片边缘大小,保持边缘不变,将中间部分进行拉伸。
/**设置图片不会变形拉伸*/
+ (UIImage *)stretchImage:(UIImage *)image edgeInsets:(UIEdgeInsets)insets
{
    //CGFloat top; // 顶端盖高度
    //CGFloat bottom; // 底端盖高度
    //CGFloat left; // 左端盖宽度
    //CGFloat right; // 右端盖宽度
    //UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);
    // 指定为拉伸模式,伸缩后重新赋值
    image = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];
    return image;
}

截取图片

截取图片的一部分


截取图片

矩形区域截取

该方法是截取图片的矩形区域,给矩形的位置大小就可以了。

+ (UIImage *)cropImage:(UIImage *)image cropRect:(CGRect)rect
{
    if(!image){
        return nil;
    }
    
    CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, rect, subImageRef);
    UIImage *cropImage = [UIImage imageWithCGImage:subImageRef];
    UIGraphicsEndImageContext();
    CGImageRelease(subImageRef);
    return cropImage;
}

指定区域截取

通过一系列的关键点来控制要需要截取的图片区域,使用path来设置剪裁区域。

+ (UIImage *)cropImage:(UIImage *)image pointArray:(NSArray *)pointArr
{
    if (pointArr.count == 0 || !image) {
        return nil;
    }
    
    CGPoint *points = malloc(sizeof(CGPoint) * pointArr.count);
    for (int i = 0; i < pointArr.count; ++i) {
        points[i] = [[pointArr objectAtIndex:i] CGPointValue];
    }
    
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width * image.scale, image.size.height * image.scale));
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextBeginPath(context);
    CGContextAddLines(context, points, pointArr.count);
    CGContextClosePath(context);
    CGRect boundsRect = CGContextGetPathBoundingBox(context);
    UIGraphicsEndImageContext();
    
    UIGraphicsBeginImageContext(boundsRect.size);
    context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, CGRectMake(0, 0, boundsRect.size.width, boundsRect.size.height));
    
    CGMutablePathRef  path = CGPathCreateMutable();
    CGAffineTransform transform = CGAffineTransformMakeTranslation(-boundsRect.origin.x, -boundsRect.origin.y);
    CGPathAddLines(path, &transform, points, pointArr.count);
    
    CGContextBeginPath(context);
    CGContextAddPath(context, path);
    CGContextClip(context);
    
    [image drawInRect:CGRectMake(-boundsRect.origin.x, -boundsRect.origin.y, image.size.width * image.scale, image.size.height * image.scale)];
    
    UIImage *cropImage = UIGraphicsGetImageFromCurrentImageContext();
    
    CGPathRelease(path);
    UIGraphicsEndImageContext();
    
    return cropImage;
}

给图片打马赛克

打码图片

马赛克的主要算法

unsigned char *pixels[4] = {0};
if (i % sizeLevel == 0) {
   if (j % sizeLevel == 0) {
        memcpy(pixels, bitMapData+4*currentIndex, 4);
   }else{
        memcpy(bitMapData+4*currentIndex, pixels, 4);
   }
}else{
   preCurrentIndex = (i-1)*imageW+j;
   memcpy(bitMapData+4*currentIndex, bitMapData+4*preCurrentIndex, 4);
}

拖动打码实现

使用两张图片来实现,原图放底部,马赛克处理过的图片在上层,用layer来控制区域的显示,具体实现可查看demo。

self.imageLayer = [CALayer layer];
self.imageLayer.frame = self.bounds;
[self.layer addSublayer:self.imageLayer];
        
self.shapeLayer = [CAShapeLayer layer];
self.shapeLayer.frame = self.bounds;
self.shapeLayer.lineCap = kCALineCapRound;
self.shapeLayer.lineJoin = kCALineJoinRound;
self.shapeLayer.lineWidth = 20;
self.shapeLayer.strokeColor = [UIColor blueColor].CGColor;
self.shapeLayer.fillColor = nil;//此处必须设为nil,否则后边添加addLine的时候会自动填充

self.imageLayer.mask = self.shapeLayer;
self.path = CGPathCreateMutable();

图片圆角处理

通过Quartz2D裁剪图片

/**圆形图片*/
+ (UIImage *)circleImage:(UIImage *)image
{
    if(!image){
        return nil;
    }

    UIGraphicsBeginImageContext(image.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    CGContextAddEllipseInRect(ctx, rect);
    CGContextClip(ctx);
    [image drawInRect:rect];
    UIImage *cicleImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return cicleImage;
}

Demo

demo

参考

马赛克算法

相关文章

  • 图片处理方法(截取、马赛克、拉伸)

    图片拉伸处理 实现类似Android中点9图的效果,拉伸图片不造成变形且不降低图片清晰度. 截取图片 截取图片的一...

  • UIImage图片处理,旋转、截取、平铺、缩放等操作

    UIImage图片处理,旋转、截取、平铺、缩放等操作 UIImage图片处理,旋转、截取、平铺、缩放等操作

  • 图片处理

    1、旋转2、裁剪3、截取4、平铺 自由拉伸 等比例缩放 根据颜色生成图片 截取某个view视图 文字水印 图片水印...

  • iOS-评分图片处理(可以小数)

    图片处理。思路是把红色图片截取,然后截取出的图片放到imageView上。imageView的width = 图片...

  • 图片拉伸处理

    Code Sketch GitHub StretchImageDemo Articles iOS 图片拉伸技巧 i...

  • 处理图片拉伸变形的三种方法

    UI给的图片入上图,如果按照如下的代码。 图片就会拉伸变形成入上图所示。有三种方法可以处理图片的拉伸变形问题。 第...

  • CGContextDrawImage(context, rect

    在截取头像时,需要获取一张图片的指定rect内的图片,如果传入的rect在原图片之外那么就会出现截取的图片拉伸的情...

  • iOS中图片处理之马赛克算法

    马赛克 马赛克在图片效果中应该是一种最常见的处理方式,日常生活中也几乎处处可见。前段时间项目中要实现图片马赛克处理...

  • iOS -- 图片处理

    一、目录 1> 图片拉伸处理 2> 图片扩展名 3> 大图减小高度,图片拉伸处理 4> 点击大图,Modal出来,...

  • iOS 图片拉伸

    参考链接 在iOS6.0中,UIImage提供了一个方法处理图片拉伸 方法解释: 参数: resizingMode...

网友评论

    本文标题:图片处理方法(截取、马赛克、拉伸)

    本文链接:https://www.haomeiwen.com/subject/faxduxtx.html