project_files/HedgewarsMobile/Classes/otherSrc/UIImageExtra.m
changeset 3546 ccf4854df294
parent 3545 b07ee704f35d
child 3547 02875b1145b7
equal deleted inserted replaced
3545:b07ee704f35d 3546:ccf4854df294
     1 //
       
     2 //  UIImageExtra.m
       
     3 //  HedgewarsMobile
       
     4 //
       
     5 //  Created by Vittorio on 08/04/10.
       
     6 //  Copyright 2010 __MyCompanyName__. All rights reserved.
       
     7 //
       
     8 
       
     9 #import "UIImageExtra.h"
       
    10 
       
    11 
       
    12 @implementation UIImage (extra)
       
    13  
       
    14 -(UIImage *)scaleToSize:(CGSize) size {
       
    15   // Create a bitmap graphics context
       
    16   // This will also set it as the current context
       
    17   UIGraphicsBeginImageContext(size);
       
    18  
       
    19   // Draw the scaled image in the current context
       
    20   [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
       
    21  
       
    22   // Create a new image from current context
       
    23   UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
       
    24  
       
    25   // Pop the current context from the stack
       
    26   UIGraphicsEndImageContext();
       
    27  
       
    28   // Return our new scaled image (autoreleased)
       
    29   return scaledImage;
       
    30 }
       
    31 
       
    32 -(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint {
       
    33     // create a contex of size of the background image
       
    34     return [self mergeWith:secondImage atPoint:secondImagePoint atSize:self.size];
       
    35 }
       
    36 
       
    37 -(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint atSize:(CGSize) resultingSize {
       
    38     UIGraphicsBeginImageContext(resultingSize);
       
    39     
       
    40     // drav the background image
       
    41     [self drawAtPoint:CGPointMake(0,0)];
       
    42     
       
    43     // draw the image on top of the first image
       
    44     [secondImage drawAtPoint:secondImagePoint];
       
    45     
       
    46     // create an image from the current contex (not thread safe)
       
    47     UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
       
    48     
       
    49     // free drawing contex
       
    50     UIGraphicsEndImageContext();
       
    51     
       
    52     // return the resulting autoreleased image
       
    53     return resultImage;
       
    54 }
       
    55 
       
    56 -(id) initWithContentsOfFile:(NSString *)path andCutAt:(CGRect) rect {
       
    57     // load image from path
       
    58     UIImage *image = [[UIImage alloc] initWithContentsOfFile: path];
       
    59     
       
    60     if (nil != image) {
       
    61         // get its CGImage representation with a give size
       
    62         CGImageRef cgImgage = CGImageCreateWithImageInRect([image CGImage], rect);
       
    63     
       
    64         // clean memory
       
    65         [image release];
       
    66     
       
    67         // create a UIImage from the CGImage (memory must be allocated already)
       
    68         UIImage *sprite = [self initWithCGImage:cgImgage];
       
    69     
       
    70         // clean memory
       
    71         CGImageRelease(cgImgage);
       
    72 
       
    73         // return resulting image
       
    74         return sprite;
       
    75     } else {
       
    76         DLog(@"error - image == nil");
       
    77         return nil;
       
    78     }
       
    79 }
       
    80 
       
    81 -(UIImage *)convertToGrayScale {
       
    82   // Create image rectangle with current image width/height
       
    83   CGRect imageRect = CGRectMake(0, 0, self.size.width, self.size.height);
       
    84  
       
    85   // Grayscale color space
       
    86   CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
       
    87  
       
    88   // Create bitmap content with current image size and grayscale colorspace
       
    89   CGContextRef context = CGBitmapContextCreate(nil, self.size.width, self.size.height, 8, 0, colorSpace, kCGImageAlphaNone);
       
    90  
       
    91   // Draw image into current context, with specified rectangle
       
    92   // using previously defined context (with grayscale colorspace)
       
    93   CGContextDrawImage(context, imageRect, [self CGImage]);
       
    94  
       
    95   // Create bitmap image info from pixel data in current context
       
    96   CGImageRef imageRef = CGBitmapContextCreateImage(context);
       
    97  
       
    98   // Create a new UIImage object  
       
    99   UIImage *newImage = [UIImage imageWithCGImage:imageRef];
       
   100  
       
   101   // Release colorspace, context and bitmap information
       
   102   CGColorSpaceRelease(colorSpace);
       
   103   CGContextRelease(context);
       
   104   CFRelease(imageRef);
       
   105  
       
   106   // Return the new grayscale image
       
   107   return newImage;
       
   108 }
       
   109 
       
   110 // by http://iphonedevelopertips.com/cocoa/how-to-mask-an-image.html turned into a category by koda
       
   111 -(UIImage*) maskImageWith:(UIImage *)maskImage {
       
   112     CGImageRef maskRef = maskImage.CGImage;
       
   113     
       
   114     CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
       
   115                                         CGImageGetHeight(maskRef),
       
   116                                         CGImageGetBitsPerComponent(maskRef),
       
   117                                         CGImageGetBitsPerPixel(maskRef),
       
   118                                         CGImageGetBytesPerRow(maskRef),
       
   119                                         CGImageGetDataProvider(maskRef), NULL, false);
       
   120     
       
   121     CGImageRef masked = CGImageCreateWithMask([self CGImage], mask);
       
   122     
       
   123     CGImageRelease(mask);
       
   124     
       
   125     UIImage* retImage = [UIImage imageWithCGImage:masked];
       
   126     
       
   127     CGImageRelease(masked);
       
   128     
       
   129     return retImage;
       
   130 }
       
   131 
       
   132 // by http://blog.sallarp.com/iphone-uiimage-round-corners/ turned into a category by koda
       
   133 void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight)
       
   134 {
       
   135     float fw, fh;
       
   136     if (ovalWidth == 0 || ovalHeight == 0) {
       
   137         CGContextAddRect(context, rect);
       
   138         return;
       
   139     }
       
   140     CGContextSaveGState(context);
       
   141     CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect));
       
   142     CGContextScaleCTM (context, ovalWidth, ovalHeight);
       
   143     fw = CGRectGetWidth (rect) / ovalWidth;
       
   144     fh = CGRectGetHeight (rect) / ovalHeight;
       
   145     CGContextMoveToPoint(context, fw, fh/2);
       
   146     CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);
       
   147     CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);
       
   148     CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);
       
   149     CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);
       
   150     CGContextClosePath(context);
       
   151     CGContextRestoreGState(context);
       
   152 }
       
   153 
       
   154 -(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh {
       
   155 	UIImage * newImage = nil;
       
   156     
       
   157     NSInteger cornerWidth = sizewh.width;
       
   158     NSInteger cornerHeight = sizewh.height;
       
   159     int w = self.size.width;
       
   160     int h = self.size.height;
       
   161     
       
   162     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
       
   163     CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
       
   164     
       
   165     CGContextBeginPath(context);
       
   166     CGRect rect = CGRectMake(0, 0, w, h);
       
   167     addRoundedRectToPath(context, rect, cornerWidth, cornerHeight);
       
   168     CGContextClosePath(context);
       
   169     CGContextClip(context);
       
   170     
       
   171     CGContextDrawImage(context, CGRectMake(0, 0, w, h), self.CGImage);
       
   172     
       
   173     CGImageRef imageMasked = CGBitmapContextCreateImage(context);
       
   174     CGContextRelease(context);
       
   175     CGColorSpaceRelease(colorSpace);
       
   176     
       
   177     newImage = [UIImage imageWithCGImage:imageMasked];
       
   178     CGImageRelease(imageMasked);
       
   179         
       
   180     return newImage;
       
   181 }
       
   182 
       
   183 
       
   184 @end