UIImage的扩展方法——裁剪图片和等比列缩放图片-翻转-圆形等
来源:互联网 发布:百度地图截图软件 编辑:程序博客网 时间:2024/06/12 01:18
@interface UIImage (extend)//按比例改变图片大小-(UIImage*)changeImageSizeWithOriginalImage:(UIImage*)image percent:(float)percent;//圆形-(UIImage*)circleImage:(UIImage*)image;//截取部分图像-(UIImage*)getSubImage:(CGRect)rect;//等比例缩放-(UIImage*)scaleToSize:(CGSize)size;-(UIImage *)rotateImage:(UIImage *)aImage with:(UIImageOrientation)theorient;-(UIImage *)fixOrientation:(UIImage *)aImage;@end
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight){ float fw, fh; if (ovalWidth == 0 || ovalHeight == 0) { CGContextAddRect(context, rect); return; } CGContextSaveGState(context); CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect)); CGContextScaleCTM(context, ovalWidth, ovalHeight); fw = CGRectGetWidth(rect) / ovalWidth; fh = CGRectGetHeight(rect) / ovalHeight; CGContextMoveToPoint(context, fw, fh/2); // Start at lower right corner CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); // Top right corner CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); // Top left corner CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); // Lower left corner CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // Back to lower right CGContextClosePath(context); CGContextRestoreGState(context);}@implementation UIImage (extend)//按比例改变图片大小-(UIImage*)changeImageSizeWithOriginalImage:(UIImage*)image percent:(float)percent{ // change the image sizeUIImage *changedImage=nil;float iwidth=image.size.width*percent;float iheight=image.size.height*percent;if (image.size.width != iwidth && image.size.height != iheight){ CGSize itemSize = CGSizeMake(iwidth, iheight);UIGraphicsBeginImageContext(itemSize);CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);[image drawInRect:imageRect];changedImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext(); } else { changedImage = image; }return changedImage;}//圆角-(UIImage *) createRoundedRectImage:(UIImage*)image size:(CGSize)size roundSize:(CGSize)roundSize{ // the size of CGContextRef int w = size.width; int h = size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); CGRect rect = CGRectMake(0, 0, w, h); CGContextBeginPath(context); addRoundedRectToPath(context, rect, roundSize.width, roundSize.height); CGContextClosePath(context); CGContextClip(context); CGContextDrawImage(context, CGRectMake(0, 0, w, h), image.CGImage); CGImageRef imageMasked = CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); UIImage *image2 = [UIImage imageWithCGImage:imageMasked]; CGImageRelease(imageMasked); return image2;}//圆形-(UIImage*)circleImage:(UIImage*)image{ CGFloat inset = 0.1f; UIGraphicsBeginImageContext(image.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(context, 2); CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor); CGRect rect = CGRectMake(inset, inset, image.size.width - inset * 2.0f, image.size.height - inset * 2.0f); CGContextAddEllipseInRect(context, rect); CGContextClip(context); [image drawInRect:rect]; CGContextAddEllipseInRect(context, rect); CGContextStrokePath(context); UIImage *newimg = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newimg;}//将image按照theSize大小等比缩放并裁剪-(UIImage*)autoImage:(UIImage*)image size:(CGSize)theSize{ if (image == nil) { return nil; } CGSize imgSize = image.size; if (imgSize.height == 0 || imgSize.width == 0 || theSize.width == 0 || theSize.height == 0) { return nil; } CGFloat nx = 0.0f; CGFloat ny = 0.0f; CGFloat nw = 0.0f; CGFloat nh = 0.0f; UIImage *autoImg = image; if (imgSize.width/imgSize.height >= theSize.width/theSize.height) { autoImg = [self changeImageSizeWithOriginalImage:image percent:theSize.height/imgSize.height]; nw = theSize.width; nh = autoImg.size.height; ny = 0; nx = ABS(autoImg.size.width - theSize.width)/2; } else { autoImg = [self changeImageSizeWithOriginalImage:image percent:theSize.width/imgSize.width]; nh = theSize.height; nw = autoImg.size.width; nx = 0; ny = ABS(autoImg.size.height - theSize.height)/2; } CGRect rect = CGRectMake(nx, ny, nw, nh); CGImageRef subImageRef = CGImageCreateWithImageInRect(autoImg.CGImage, rect); CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef)); UIGraphicsBeginImageContext(smallBounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextDrawImage(context, smallBounds, subImageRef); UIImage* smallImage = [UIImage imageWithCGImage:subImageRef]; UIGraphicsEndImageContext(); CGImageRelease(subImageRef); return smallImage;}//截取部分图像-(UIImage*)getSubImage:(CGRect)rect{ CGImageRef subImageRef = CGImageCreateWithImageInRect(self.CGImage, rect); CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef)); UIGraphicsBeginImageContext(smallBounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextDrawImage(context, smallBounds, subImageRef); UIImage* smallImage = [UIImage imageWithCGImage:subImageRef]; UIGraphicsEndImageContext(); return smallImage;}//等比例缩放-(UIImage*)scaleToSize:(CGSize)size{ CGFloat width = CGImageGetWidth(self.CGImage); CGFloat height = CGImageGetHeight(self.CGImage); float verticalRadio = size.height*1.0/height; float horizontalRadio = size.width*1.0/width; float radio = 1; if(verticalRadio>1 && horizontalRadio>1) { radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio; } else { radio = verticalRadio < horizontalRadio ? verticalRadio : horizontalRadio; } width = width*radio; height = height*radio; int xPos = (size.width - width)/2; int yPos = (size.height-height)/2; // 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContext(size); // 绘制改变大小的图片 [self drawInRect:CGRectMake(xPos, yPos, width, height)]; // 从当前context中创建一个改变大小后的图片 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); // 返回新的改变大小后的图片 return scaledImage;}//方向旋转 水平:UIImageOrientationUpMirrored-(UIImage *)rotateImage:(UIImage *)aImage with:(UIImageOrientation)theorient{ CGImageRef imgRef = aImage.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); CGFloat scaleRatio = 1; CGFloat boundHeight; UIImageOrientation orient = theorient;//aImage.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(width, height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(height, width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy;}//方向-(UIImage *)fixOrientation:(UIImage *)aImage{ // No-op if the orientation is already correct if (aImage.imageOrientation == UIImageOrientationUp) return aImage; // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. CGAffineTransform transform = CGAffineTransformIdentity; switch (aImage.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, aImage.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; default: break; } switch (aImage.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; default: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage), 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx, transform); switch (aImage.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage); break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img;}@end
其他:
Combine two UIImagesTo add two UIImages together you need to make use of Graphics Context.view plaincopy to clipboardprint? - (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 { UIGraphicsBeginImageContext(image1.size); // Draw image1 [image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)]; // Draw image2 [image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)]; UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resultingImage; }
Save UIImage to Photo AlbumThis is just a one-liner: UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), context); And to know if the save was successful:view plaincopy to clipboardprint? - (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSString *message; NSString *title; if (!error) { title = NSLocalizedString(@"SaveSuccessTitle", @""); message = NSLocalizedString(@"SaveSuccessMessage", @""); } else { title = NSLocalizedString(@"SaveFailedTitle", @""); message = [error description]; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"ButtonOK", @"") otherButtonTitles:nil]; [alert show]; [alert release]; }
//UIImage转为灰度图-(UIImage*)getGrayImage:(UIImage*)sourceImage{ int width = sourceImage.size.width; int height = sourceImage.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone); CGColorSpaceRelease(colorSpace); if (context == NULL) { return nil; } CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage); UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)]; CGContextRelease(context); return grayImage;}
// 视图抖动动画+ (void)shakeView:(UIView *)view { float fDuration = 1.2f; if (view && (fDuration >= 0.1f)) { CABasicAnimation* shake = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //设置抖动幅度 shake.fromValue = [NSNumber numberWithFloat:-0.3]; shake.toValue = [NSNumber numberWithFloat:+0.3]; shake.duration = 0.1f; shake.repeatCount = fDuration/4/0.1f; shake.autoreverses = YES; [view.layer addAnimation:shake forKey:@"shakeView"]; }else{}}// 对指定视图进行截图+ (UIImage *)screenShotView:(UIView *)view{ UIImage *imageRet = nil; if (view) { if(UIGraphicsBeginImageContextWithOptions != NULL) { UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0); } else { UIGraphicsBeginImageContext(view.frame.size); } //获取图像 [view.layer renderInContext:UIGraphicsGetCurrentContext()]; imageRet = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();UIImageWriteToSavedPhotosAlbum(imageRet, nil, nil, nil); }else{APP_ASSERT_STOP} return imageRet;}//将gif图片解析成image数组+ (NSMutableArray *)praseGIFDataToImageArray:(NSData *)data; { NSMutableArray *frames = [[NSMutableArray alloc] init]; CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)data, NULL); CGFloat animationTime = 0.f; if (src) { size_t l = CGImageSourceGetCount(src); frames = [NSMutableArray arrayWithCapacity:l]; for (size_t i = 0; i < l; i++) { CGImageRef img = CGImageSourceCreateImageAtIndex(src, i, NULL); NSDictionary *properties = (NSDictionary *)CGImageSourceCopyPropertiesAtIndex(src, i, NULL); NSDictionary *frameProperties = [properties objectForKey:(NSString *)kCGImagePropertyGIFDictionary]; NSNumber *delayTime = [frameProperties objectForKey:(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; animationTime += [delayTime floatValue]; if (img) { [frames addObject:[UIImage imageWithCGImage:img]]; CGImageRelease(img); } } CFRelease(src); } return frames;}
0 0
- UIImage的扩展方法——裁剪图片和等比列缩放图片-翻转-圆形等
- UIImage的扩展方法——裁剪图片和等比列缩放图片
- UIImage的扩展方法——裁剪图片和等比列缩放图片
- UIImage 裁剪图片和等比列缩放图片
- Xamarion.IOS UIImage图片的裁剪缩放等
- iOS开发笔记之二十七——UIImage图片的移动、旋转、缩放和裁剪
- 关于UIImage图片类别-裁剪图片和等比例缩放图片实现
- 处理图片的缩放、旋转、裁剪和翻转这四种效果
- 处理图片的缩放、旋转、裁剪和翻转这四种效果
- 网络图片 和本地图片 显示 ——等比缩放
- 关于图片的等比缩放,从相机和照片选取头像,显示圆形头像
- 实现图片的等比裁剪
- 76-圆形裁剪(指定图片裁剪为圆形),添加UIImage分类,两个类方法,实现圆形裁剪
- 图片上传裁剪&等比缩放处理(html5+Canvas)
- 图片上传前预处理,等比缩放、裁剪 (html5 + canvas)
- Html5新特性 canvas画板画直线和等比缩放居中裁剪图片
- android 拍照,裁切,上传圆形头像, 图片等比缩放
- background-size布局和移动端图片的等比缩放
- 改进架构,实现动态数据源,降低java维护
- 硬盘丢失文件还能找回吗
- SAP ECC系统连接SAP PI系统的系统连接配置
- 动态规划法求找钱最少的算法(Java)
- Java追加内容到文件末尾
- UIImage的扩展方法——裁剪图片和等比列缩放图片-翻转-圆形等
- 常吃七种蔬菜帮助你自然美白
- javascript表单对象
- 合并排序-多线程算法
- 将Tomcat嵌入到自己的应用中
- spring 主配置文件
- Oracle性能调优之超越表面分析法
- 基于FPGA的图像去噪
- OCP-1Z0-051 第27题 oracle对象命名规则