美文网首页
iOS编程截取图片和压缩图片

iOS编程截取图片和压缩图片

作者: 单线程Jack | 来源:发表于2019-07-18 10:27 被阅读0次
1.图片的压缩

1、是 “压” 文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降
2、是 “缩” 文件的尺寸变小,也就是像素数减少。长宽尺寸变小,文件体积同样会减小。

这个 UIImageJPEGRepresentation(image, 0.0),是1的功能。
这个 [sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] 是2的功能。
* UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数而UIImagePNGRepresentation只需要图片引用作为参数.
* UIImagePNGRepresentation(UIImage *image)要比UIImageJPEGRepresentation(UIImage* image, 1.0)返回的图片数据量大很多.
- (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth:(CGFloat)targetWidth {
  CGSize imageSize = sourceImage.size;
  CGFloat width = imageSize.width;
  CGFloat height = imageSize.height;
  CGFloat targetHeight = (targetWidth / width) * height;
  
  UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
  [sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)];
  UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return newImage;
}
截图
//获得屏幕图像  
- (UIImage *)imageFromView: (UIView *) theView    
{  
    UIGraphicsBeginImageContext(theView.frame.size);  
    CGContextRef context = UIGraphicsGetCurrentContext();  
    [theView.layer renderInContext:context];  
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
    return theImage;  
}  
 
//获得某个范围内的屏幕图像  
- (UIImage *)imageFromView:(UIView *)theView  atFrame:(CGRect)r 
{  
    UIGraphicsBeginImageContext(theView.frame.size);  
    CGContextRef context = UIGraphicsGetCurrentContext();  
    CGContextSaveGState(context);  
    UIRectClip(r);  
    [theView.layer renderInContext:context];  
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
    return theImage;
} 

一个区分 PNG 、JPG 格式的判断方法, 取出图片数据的第一个字节, 就可以判断出图片的真实类型:

//通过图片Data数据第一个字节 来获取图片扩展名
- (NSString *)contentTypeForImageData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return @"jpeg";
        case 0x89:
            return @"png";     
        case 0x47:
            return @"gif";        
        case 0x49:   
        case 0x4D:
            return @"tiff";        
        case 0x52:  
            if ([data length] < 12) {
                return nil;
            }
            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return @"webp";
            }
            return nil;
    }
    return nil;
}

截取圆形图片

/**

 * parm:sourceImage:需要剪切的原图片

 * parm:borderWidth:剪切后的边框宽度

 * parm:borderColor:边框颜色

 */

- (UIImage *)circleImageWithImage:(UIImage *)sourceImage borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor{

    CGFloat imageWidth = sourceImage.size.width + 2 * borderWidth;

    CGFloat imageHeight = sourceImage.size.height + 2 * borderWidth;

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageWidth, imageHeight), NO, 0.0);

    UIGraphicsGetCurrentContext();

    CGFloat radius = (sourceImage.size.width < sourceImage.size.height?sourceImage.size.width:sourceImage.size.height)*0.5;

    UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(imageWidth * 0.5, imageHeight * 0.5) radius:radius startAngle:0 endAngle:M_PI * 2 clockwise:YES];

    bezierPath.lineWidth = borderWidth;

    [borderColor setStroke];

    [bezierPath stroke];

    [bezierPath addClip];

    [sourceImage drawInRect:CGRectMake(borderWidth, borderWidth, sourceImage.size.width, sourceImage.size.height)];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();   

    UIGraphicsEndImageContext();    

    return image;

}

相关文章

网友评论

      本文标题:iOS编程截取图片和压缩图片

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