美文网首页图像处理iOS
iOS 图片处理的常用方法

iOS 图片处理的常用方法

作者: ZJ_偶尔上路 | 来源:发表于2017-01-12 20:41 被阅读118次

    最近整理了图片常用处理的一些方法,包括

    
    /**
     改变图片透明度
    
     @param alpha 透明度 0.0~1.0
     @return 已改变透明度的图片
     */
    - (UIImage *)sa_imageWithAlpha:(CGFloat)alpha;
    
    /**
     任意改变图片尺寸
    
     @param size 需要的图片尺寸
     @return 已改变尺寸的图片
     */
    - (UIImage *)sa_imageWithSize:(CGSize)size;
    
    /**
     等比例放缩图片
    
     @param scale 放缩图片比例
     @return 已放缩后的图片
     */
    - (UIImage *)sa_imageStretchWithScale:(CGFloat)scale;
    
    /**
     裁剪图片 用贝塞尔曲线画图根据实际操作 这里仅提供常用类型裁剪
    
     @param rect 在原图片的基础上裁剪图片的rect
     @param style 裁剪图片风格
     @return 裁剪出来的图片
     */
    - (UIImage *)sa_imageClipWithRect:(CGRect)rect andStyle:(ImageClipStyle)style;
    
    /**
     图片压缩(质量)
    
     @param ratio 压缩比例0.0~1.0
     @return 质量压缩后的:图片数据流
     */
    - (NSData *)sa_imageCompressReturnDataWithRatio:(CGFloat)ratio;
    
    /**
     图片压缩(质量)
    
     @param ratio ratio 压缩比例0.0~1.0
     @return 质量压缩后的:图片
     */
    - (UIImage *)sa_imageCompressReturnImageWithRatio:(CGFloat)ratio;
    
    /**
     图片模糊
    
     @param level 模糊级别0.0~1.0
     @return 模糊处理后的图片
     */
    - (UIImage *)sa_imageBlurWithLevel:(CGFloat)level;
    
    /**
     图片旋转
    
     @param orientation 在原图片基础上旋转方向:左、右、下
     @return 旋转后的图片
     */
    - (UIImage *)sa_imageRotateWithOrientation:(UIImageOrientation)orientation;
    
    /**
     将UIView转化成图片
     放到这里有点不合适,应该放UIView的category里面,放这里暂时用着
    
     @param theView 需要转化的UIView
     @return UIView的图片
     */
    - (UIImage *)sa_getImageFromView:(UIView *)theView;
    
    /**
     两张图片叠加、合成
    
     @param rect 本身图片对于合成图片的rect
     @param anotherImage 图片2
     @param anotherRect 图片2对于合成图片的rect
     @param size 合成图片的size
     @return 合成的图片
     */
    - (UIImage *)sa_integrateImageWithRect:(CGRect)rect
                                     andAnotherImage:(UIImage *)anotherImage
                                    anotherImageRect:(CGRect)anotherRect
                                 integratedImageSize:(CGSize)size;
    
    /**
     图片添加水印
    
     @param markImage 水印图片
     @param imgRect 水印图片对于原图片的rect
     @param alpha 水印图片透明度
     @param markStr 水印文字
     @param strRect 水印文字对于原图片的rect
     @param attribute 水印文字的设置颜色、字体大小
     @return 添加水印后的图片
     */
    - (UIImage *)sa_imageWaterMark:(UIImage *)markImage
                         imageRect:(CGRect)imgRect
                    markImageAlpha:(CGFloat)alpha
                        markString:(NSString *)markStr
                        stringRect:(CGRect)strRect
                   stringAttribute:(NSDictionary *)attribute;
    
    @end
    

    方法实现:

    
    - (UIImage *)sa_imageWithAlpha:(CGFloat)alpha {
        if (alpha>1.0) {
            alpha = 1.0;
        }
        if (alpha<=0.0) {
            alpha = 0.0;
        }
        UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGRect area = CGRectMake(0, 0, self.size.width, self.size.height);
        CGContextScaleCTM(ctx, 1, -1);
        CGContextTranslateCTM(ctx, 0, -area.size.height);
        CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
        CGContextSetAlpha(ctx, alpha);
        CGContextDrawImage(ctx, area, self.CGImage);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    
    - (UIImage *)sa_imageWithSize:(CGSize)size {
        UIGraphicsBeginImageContext(CGSizeMake(size.width, size.height));
        [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
        UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return resizedImage;
    }
    
    - (UIImage *)sa_imageStretchWithScale:(CGFloat)scale {
        UIGraphicsBeginImageContext(CGSizeMake(self.size.width * scale, self.size.height * scale));
        [self drawInRect:CGRectMake(0, 0, self.size.width * scale, self.size.height * scale)];
        UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return scaledImage;
    }
    
    - (UIImage *)sa_imageClipWithRect:(CGRect)rect andStyle:(ImageClipStyle)style {
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
        UIBezierPath *path;
        switch (style) {
                case ImageClipRectStyle:path = [UIBezierPath bezierPathWithRect:rect];
                break;
                case ImageClipOvalStyle:path = [UIBezierPath bezierPathWithOvalInRect:rect];
                break;
            default:
                break;
        }
        [path addClip];
        [self drawAtPoint:CGPointZero];
        UIImage *circleImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return circleImage;
    }
    
    - (NSData *)sa_imageCompressReturnDataWithRatio:(CGFloat)ratio {
        //UIImageJPEGRepresentation和UIImagePNGRepresentation
        if (ratio>1.0) {
            ratio = 1.0;
        }
        if (ratio<=0) {
            ratio = 0.0;
        }
        NSData *compressedData =  UIImageJPEGRepresentation(self, ratio);
        return compressedData;
    }
    
    - (UIImage *)sa_imageCompressReturnImageWithRatio:(CGFloat)ratio {
        //UIImageJPEGRepresentation和UIImagePNGRepresentation
        if (ratio>1.0) {
            ratio = 1.0;
        }
        if (ratio<=0) {
            ratio = 0.0;
        }
        NSData *compressedData =  UIImageJPEGRepresentation(self, ratio);
        UIImage *compressedImage = [UIImage imageWithData:compressedData];
        return compressedImage;
    }
    
    - (UIImage *)sa_imageBlurWithLevel:(CGFloat)level {
        if (level>1.0) {
            level = 1.0;
        }
        if (level<=0) {
            level = 0.0;
        }
        int boxSize = (int)(level * 100);
        boxSize = boxSize - (boxSize % 2) + 1;
        
        CGImageRef img = self.CGImage;
        
        vImage_Buffer inBuffer, outBuffer;
        vImage_Error error;
        
        void *pixelBuffer;
        
        CGDataProviderRef inProvider = CGImageGetDataProvider(img);
        CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
        
        inBuffer.width = CGImageGetWidth(img);
        inBuffer.height = CGImageGetHeight(img);
        inBuffer.rowBytes = CGImageGetBytesPerRow(img);
        
        inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
        
        pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
                             CGImageGetHeight(img));
        
        if(pixelBuffer == NULL)
        
        outBuffer.data = pixelBuffer;
        outBuffer.width = CGImageGetWidth(img);
        outBuffer.height = CGImageGetHeight(img);
        outBuffer.rowBytes = CGImageGetBytesPerRow(img);
        
        error = vImageBoxConvolve_ARGB8888(&inBuffer,
                                           &outBuffer,
                                           NULL,
                                           0,
                                           0,
                                           boxSize,
                                           boxSize,
                                           NULL,
                                           kvImageEdgeExtend);
        
        
        if (error) {
        }
        
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef ctx = CGBitmapContextCreate(
                                                 outBuffer.data,
                                                 outBuffer.width,
                                                 outBuffer.height,
                                                 8,
                                                 outBuffer.rowBytes,
                                                 colorSpace,
                                                 kCGImageAlphaNoneSkipLast);
        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
        UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
        
        //clean up
        CGContextRelease(ctx);
        CGColorSpaceRelease(colorSpace);
        
        free(pixelBuffer);
        CFRelease(inBitmapData);
        
        CGColorSpaceRelease(colorSpace);
        CGImageRelease(imageRef);
        
        return returnImage;
    }
    
    - (UIImage *)sa_imageRotateWithOrientation:(UIImageOrientation)orientation {
        long double rotate = 0.0;
        CGRect rect;
        float translateX = 0;
        float translateY = 0;
        float scaleX = 1.0;
        float scaleY = 1.0;
        
        switch (orientation) {
            case UIImageOrientationLeft:
                rotate = M_PI_2;
                rect = CGRectMake(0, 0, self.size.height, self.size.width);
                translateX = 0;
                translateY = -rect.size.width;
                scaleY = rect.size.width/rect.size.height;
                scaleX = rect.size.height/rect.size.width;
                break;
            case UIImageOrientationRight:
                rotate = 3 * M_PI_2;
                rect = CGRectMake(0, 0, self.size.height, self.size.width);
                translateX = -rect.size.height;
                translateY = 0;
                scaleY = rect.size.width/rect.size.height;
                scaleX = rect.size.height/rect.size.width;
                break;
            case UIImageOrientationDown:
                rotate = M_PI;
                rect = CGRectMake(0, 0, self.size.width, self.size.height);
                translateX = -rect.size.width;
                translateY = -rect.size.height;
                break;
            default:
                rotate = 0.0;
                rect = CGRectMake(0, 0, self.size.width, self.size.height);
                translateX = 0;
                translateY = 0;
                break;
        }
        
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        //做CTM变换
        CGContextTranslateCTM(context, 0.0, rect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextRotateCTM(context, rotate);
        CGContextTranslateCTM(context, translateX, translateY);
        CGContextScaleCTM(context, scaleX, scaleY);
        //绘制图片
        CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), self.CGImage);
        UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return rotatedImage;
    }
    
    - (UIImage *)sa_getImageFromView:(UIView *)theView {
        UIGraphicsBeginImageContextWithOptions(theView.bounds.size, YES, theView.layer.contentsScale);
        [theView.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    
    - (UIImage *)sa_integrateImageWithRect:(CGRect)rect
                                     andAnotherImage:(UIImage *)anotherImage
                                    anotherImageRect:(CGRect)anotherRect
                                 integratedImageSize:(CGSize)size
    {
        UIGraphicsBeginImageContext(size);
        [self drawInRect:rect];
        [anotherImage drawInRect:anotherRect];
        UIImage *integratedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return integratedImage;
    }
    
    - (UIImage *)sa_imageWaterMark:(UIImage *)markImage
                         imageRect:(CGRect)imgRect
                    markImageAlpha:(CGFloat)alpha
                        markString:(NSString *)markStr
                        stringRect:(CGRect)strRect
                   stringAttribute:(NSDictionary *)attribute{
        
        UIGraphicsBeginImageContext(self.size);
        [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModeNormal alpha:1.0];
        if (markImage) {
            [markImage drawInRect:imgRect blendMode:kCGBlendModeNormal alpha:alpha];
        }
        
        if (markStr) {
            //UILabel convert  to UIImage
            UILabel *markStrLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, strRect.size.width, strRect.size.height)];
            markStrLabel.textAlignment = NSTextAlignmentCenter;
            markStrLabel.numberOfLines = 0;
            markStrLabel.attributedText = [[NSAttributedString alloc] initWithString:markStr attributes:attribute];
            UIImage *image = [self sa_getImageFromView:markStrLabel];
            [image drawInRect:strRect blendMode:kCGBlendModeNormal alpha:1.0];;
        }
        UIImage *waterMarkedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return waterMarkedImage;
    }
    

    相关文章

      网友评论

        本文标题:iOS 图片处理的常用方法

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