Skip to content

Instantly share code, notes, and snippets.

@cweider
Created April 22, 2012 06:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cweider/2460277 to your computer and use it in GitHub Desktop.
Save cweider/2460277 to your computer and use it in GitHub Desktop.
CTUIImage+Extensions
@implementation UIImage (CTUIImageExtensions)
+ (UIImage *)ct_imageWithPDFNamed:(NSString *)name size:(CGSize)size
{
CGFloat scale = 1;
CGColorSpaceRef colorspace = NULL;
CGContextRef layerContext = NULL;
void *layerBytes = NULL;
CGPDFDocumentRef iconDocument = NULL;
CGImageRef cg_image = NULL;
UIImage *image = nil;
if ([UIScreen instancesRespondToSelector:@selector(scale)])
{
scale = [[UIScreen mainScreen] scale];
}
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
size = CGSizeMake(size.width * scale, size.height * scale);
}
else
{
scale = 1;
}
/* Setup */
colorspace = CGColorSpaceCreateDeviceRGB();
CGRect layerRect = CGRectMake(0, 0, size.width, size.height);
layerBytes = calloc(size.width * size.height, 4);
if (!layerBytes)
goto END_RENDER;
layerContext = CGBitmapContextCreate(
layerBytes,
size.width,
size.height,
8,
4 * size.width,
colorspace,
kCGImageAlphaPremultipliedLast);
if (!layerContext)
goto END_RENDER;
CFStringRef iconPath = (CFStringRef)[[NSBundle mainBundle] pathForResource:name ofType:@"pdf"];
if (!iconPath)
goto END_RENDER;
CFURLRef iconURL = CFURLCreateWithFileSystemPath(NULL, iconPath, kCFURLPOSIXPathStyle, false);
iconDocument = CGPDFDocumentCreateWithURL(iconURL);
CFRelease(iconURL);
if (!iconDocument)
goto END_RENDER;
CGPDFPageRef iconPage = CGPDFDocumentGetPage(iconDocument, 1);
/* Draw */
CGRect iconRect = CGPDFPageGetBoxRect(iconPage, kCGPDFCropBox);
CGAffineTransform iconTransform = CGPDFPageGetDrawingTransform(iconPage, kCGPDFCropBox, iconRect, 0, true);
CGFloat scaleFactor = MIN(layerRect.size.width/iconRect.size.width, layerRect.size.height/iconRect.size.width);
iconTransform = CGAffineTransformTranslate(iconTransform, CGRectGetWidth(layerRect)/2., CGRectGetHeight(layerRect)/2.);
iconTransform = CGAffineTransformScale(iconTransform, scaleFactor, scaleFactor);
iconTransform = CGAffineTransformTranslate(iconTransform, -CGRectGetMinX(iconRect)-CGRectGetWidth(iconRect)/2., -CGRectGetMinY(iconRect)-CGRectGetHeight(iconRect)/2.);
CGContextConcatCTM(layerContext, iconTransform);
CGContextDrawPDFPage(layerContext, iconPage);
/* Render */
cg_image = CGBitmapContextCreateImage(layerContext);
if (!cg_image)
goto END_RENDER;
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
image = [UIImage imageWithCGImage:cg_image scale:scale orientation:UIImageOrientationUp];
}
else
{
image = [UIImage imageWithCGImage:cg_image];
}
END_RENDER:
if (cg_image != NULL)
CGImageRelease(cg_image);
if (iconDocument != NULL)
CGPDFDocumentRelease(iconDocument);
if (layerContext != NULL)
CGContextRelease(layerContext);
if (layerBytes != NULL)
free(layerBytes);
if (colorspace != NULL)
CGColorSpaceRelease(colorspace);
return image;
}
- (UIImage *)ct_imageWithShadowOffset:(CGSize)offset blur:(CGFloat)blur color:(UIColor *)color
{
CGColorSpaceRef colorspace = NULL;
CGContextRef layerContext = NULL;
void *layerBytes = NULL;
CGImageRef cg_image = NULL;
UIImage *image = nil;
CGFloat scale = [self respondsToSelector:@selector(scale)] ? [self scale] : 1;
CGSize size = [self size];
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
size = CGSizeMake(size.width * scale, size.height * scale);
offset = CGSizeMake(offset.width * scale, offset.height * scale);
blur = blur * scale;
}
else
{
scale = 1;
}
blur = MAX(blur, 0);
offset = CGSizeMake(offset.width, -offset.height);
/* Setup */
colorspace = CGColorSpaceCreateDeviceRGB();
CGRect layerRect = CGRectMake(blur+fabs(offset.width), blur+fabs(offset.height), size.width, size.height);
size = CGSizeMake(size.width+blur*2+fabsf(offset.width)*2, size.height+blur*2+fabsf(offset.height)*2);
layerBytes = calloc(size.width * size.height, 4);
if (!layerBytes)
goto END_RENDER;
layerContext = CGBitmapContextCreate(
layerBytes,
size.width,
size.height,
8,
4 * size.width,
colorspace,
kCGImageAlphaPremultipliedLast);
if (!layerContext)
goto END_RENDER;
/* Draw */
CGContextSetShadowWithColor(layerContext, offset, blur, [color CGColor]);
CGContextBeginTransparencyLayer(layerContext, NULL);
CGContextDrawImage(layerContext, layerRect, [self CGImage]);
CGContextEndTransparencyLayer(layerContext);
/* Render */
cg_image = CGBitmapContextCreateImage(layerContext);
if (!cg_image)
goto END_RENDER;
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
image = [UIImage imageWithCGImage:cg_image scale:scale orientation:UIImageOrientationUp];
}
else
{
image = [UIImage imageWithCGImage:cg_image];
}
END_RENDER:
if (colorspace != NULL)
CGColorSpaceRelease(colorspace);
if (layerContext != NULL)
CGContextRelease(layerContext);
if (cg_image != NULL)
CGImageRelease(cg_image);
if (layerBytes != NULL)
free(layerBytes);
return image;
}
- (UIImage *)ct_imageWithOverlayColor:(UIColor *)color
{
CGColorSpaceRef colorspace = NULL;
CGContextRef layerContext = NULL;
void *layerBytes = NULL;
CGImageRef cg_image = NULL;
UIImage *image = nil;
CGFloat scale = [self respondsToSelector:@selector(scale)] ? [self scale] : 1;
CGSize size = [self size];
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
size = CGSizeMake(size.width * scale, size.height * scale);
}
else
{
scale = 1;
}
/* Setup */
colorspace = CGColorSpaceCreateDeviceRGB();
CGRect layerRect = CGRectMake(0, 0, size.width, size.height);
layerBytes = calloc(size.width * size.height, 4);
if (!layerBytes)
goto END_RENDER;
layerContext = CGBitmapContextCreate(
layerBytes,
size.width,
size.height,
8,
4 * size.width,
colorspace,
kCGImageAlphaPremultipliedLast);
if (!layerContext)
goto END_RENDER;
/* Draw */
CGContextDrawImage(layerContext, layerRect, [self CGImage]);
CGContextSetBlendMode(layerContext, kCGBlendModeSourceIn);
CGContextSetFillColorWithColor(layerContext, [color CGColor]);
CGContextFillRect(layerContext, layerRect);
/* Render */
cg_image = CGBitmapContextCreateImage(layerContext);
if (!cg_image)
goto END_RENDER;
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
image = [UIImage imageWithCGImage:cg_image scale:scale orientation:UIImageOrientationUp];
}
else
{
image = [UIImage imageWithCGImage:cg_image];
}
END_RENDER:
if (colorspace != NULL)
CGColorSpaceRelease(colorspace);
if (layerContext != NULL)
CGContextRelease(layerContext);
if (cg_image != NULL)
CGImageRelease(cg_image);
if (layerBytes != NULL)
free(layerBytes);
return image;
}
- (UIImage *)ct_imageWithInnerShadowOffset:(CGSize)offset color:(UIColor *)color
{
CGColorSpaceRef colorspace = NULL;
CGContextRef layerContext = NULL;
void *layerBytes = NULL;
CGImageRef cg_image = NULL;
UIImage *image = nil;
CGFloat scale = [self respondsToSelector:@selector(scale)] ? [self scale] : 1;
CGSize size = [self size];
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
size = CGSizeMake(size.width * scale, size.height * scale);
offset = CGSizeMake(offset.width * scale, offset.height * scale);
}
else
{
scale = 1;
}
offset = CGSizeMake(offset.width, -offset.height);
/* Setup */
colorspace = CGColorSpaceCreateDeviceRGB();
CGRect layerRect = CGRectMake(0, 0, size.width, size.height);
layerBytes = calloc(size.width * size.height, 4);
if (!layerBytes)
goto END_RENDER;
layerContext = CGBitmapContextCreate(
layerBytes,
size.width,
size.height,
8,
4 * size.width,
colorspace,
kCGImageAlphaPremultipliedLast);
if (!layerContext)
goto END_RENDER;
/* Draw */
CGContextDrawImage(layerContext, layerRect, [self CGImage]);
CGLayerRef shadowLayer = CGLayerCreateWithContext(layerContext, layerRect.size, NULL);
CGContextRef shadowContext = CGLayerGetContext(shadowLayer);
CGContextDrawImage(shadowContext, CGRectOffset(layerRect, offset.width, offset.height), [self CGImage]);
CGContextSetBlendMode(shadowContext, kCGBlendModeSourceOut);
CGContextSetFillColorWithColor(shadowContext, [color CGColor]);
CGContextFillRect(shadowContext, layerRect);
CGContextSetBlendMode(layerContext, kCGBlendModeSourceAtop);
CGContextDrawLayerInRect(layerContext, layerRect, shadowLayer);
CGLayerRelease(shadowLayer);
/* Render */
cg_image = CGBitmapContextCreateImage(layerContext);
if (!cg_image)
goto END_RENDER;
if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)])
{
image = [UIImage imageWithCGImage:cg_image scale:scale orientation:UIImageOrientationUp];
}
else
{
image = [UIImage imageWithCGImage:cg_image];
}
END_RENDER:
if (colorspace != NULL)
CGColorSpaceRelease(colorspace);
if (layerContext != NULL)
CGContextRelease(layerContext);
if (cg_image != NULL)
CGImageRelease(cg_image);
if (layerBytes != NULL)
free(layerBytes);
return image;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment