iPhone UIImage扩展方法,支持放大和旋转 (转)

来源:互联网 发布:HL编程 编辑:程序博客网 时间:2024/06/10 00:39

转载自 http://www.devdiv.com/home.php?mod=space&uid=45444&do=blog&id=6363


iPhone UIImage扩展方法,支持放大和旋转 (转)

已有 94 次阅读 2011-11-14 10:10 | 旋转

    #import <Foundation/Foundation.h>
    @interface UIImage (CS_Extensions)
    - (UIImage *)imageAtRect:(CGRect)rect;
    - (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize;
    - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
    - (UIImage *)imageByScalingToSize:(CGSize)targetSize;
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians;
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
    @end;

    //
    //  UIImage-Extensions.m
    //
    //  Created by Hardy Macia on 7/1/09.
    //  Copyright 2009 Catamount Software. All rights reserved.
    //
    #import "UIImage-Extensions.h"
    CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
    CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};
    @implementation UIImage (CS_Extensions)
    -(UIImage *)imageAtRect:(CGRect)rect
    {
      
       CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
       UIImage* subImage = [UIImage imageWithCGImage: imageRef];
       CGImageRelease(imageRef);
      
       return subImage;
      
    }
    - (UIImage *)imageByScalingProportionallyToMinimumSize:(CGSize)targetSize {
      
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
      
       CGSize imageSize = sourceImage.size;
       CGFloat width = imageSize.width;
       CGFloat height = imageSize.height;
      
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
      
       CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
      
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
      
       if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
          
          CGFloat widthFactor = targetWidth / width;
          CGFloat heightFactor = targetHeight / height;
          
          if (widthFactor > heightFactor)
             scaleFactor = widthFactor;
          else
             scaleFactor = heightFactor;
          
          scaledWidth  = width * scaleFactor;
          scaledHeight = height * scaleFactor;
          
          // center the image
          
          if (widthFactor > heightFactor) {
             thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
          } else if (widthFactor < heightFactor) {
             thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
          }
       }
      
      
       // this is actually the interesting part:
      
       UIGraphicsBeginImageContext(targetSize);
      
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
      
       [sourceImage drawInRect:thumbnailRect];
      
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
      
       if(newImage == nil) NSLog(@"could not scale image");
      
      
       return newImage ;
    }
    - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {
      
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
      
       CGSize imageSize = sourceImage.size;
       CGFloat width = imageSize.width;
       CGFloat height = imageSize.height;
      
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
      
       CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
      
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
      
       if (CGSizeEqualToSize(imageSize, targetSize) == NO) {
          
          CGFloat widthFactor = targetWidth / width;
          CGFloat heightFactor = targetHeight / height;
          
          if (widthFactor < heightFactor)
             scaleFactor = widthFactor;
          else
             scaleFactor = heightFactor;
          
          scaledWidth  = width * scaleFactor;
          scaledHeight = height * scaleFactor;
          
          // center the image
          
          if (widthFactor < heightFactor) {
             thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
          } else if (widthFactor > heightFactor) {
             thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
          }
       }
      
      
       // this is actually the interesting part:
      
       UIGraphicsBeginImageContext(targetSize);
      
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
      
       [sourceImage drawInRect:thumbnailRect];
      
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
      
       if(newImage == nil) NSLog(@"could not scale image");
      
      
       return newImage ;
    }
    - (UIImage *)imageByScalingToSize:(CGSize)targetSize {
      
       UIImage *sourceImage = self;
       UIImage *newImage = nil;
      
       //   CGSize imageSize = sourceImage.size;
       //   CGFloat width = imageSize.width;
       //   CGFloat height = imageSize.height;
      
       CGFloat targetWidth = targetSize.width;
       CGFloat targetHeight = targetSize.height;
      
       //   CGFloat scaleFactor = 0.0;
       CGFloat scaledWidth = targetWidth;
       CGFloat scaledHeight = targetHeight;
      
       CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
      
       // this is actually the interesting part:
      
       UIGraphicsBeginImageContext(targetSize);
      
       CGRect thumbnailRect = CGRectZero;
       thumbnailRect.origin = thumbnailPoint;
       thumbnailRect.size.width  = scaledWidth;
       thumbnailRect.size.height = scaledHeight;
      
       [sourceImage drawInRect:thumbnailRect];
      
       newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
      
       if(newImage == nil) NSLog(@"could not scale image");
      
      
       return newImage ;
    }
    - (UIImage *)imageRotatedByRadians:(CGFloat)radians
    {
       return [self imageRotatedByDegrees:RadiansToDegrees(radians)];
    }
    - (UIImage *)imageRotatedByDegrees:(CGFloat)degrees
    {  
       // calculate the size of the rotated view's containing box for our drawing space
       UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
       CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
       rotatedViewBox.transform = t;
       CGSize rotatedSize = rotatedViewBox.frame.size;
       [rotatedViewBox release];
      
       // Create the bitmap context
       UIGraphicsBeginImageContext(rotatedSize);
       CGContextRef bitmap = UIGraphicsGetCurrentContext();
      
       // Move the origin to the middle of the image so we will rotate and scale around the center.
       CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
      
       //   // Rotate the image context
       CGContextRotateCTM(bitmap, DegreesToRadians(degrees));
      
       // Now, draw the rotated/scaled image into the context
       CGContextScaleCTM(bitmap, 1.0, -1.0);
       CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
      
       UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
       return newImage;
      
    }
    @end;


原创粉丝点击