iPhoneで画像を作成することがあったので、やり方をまとめておきます。
以下の方法で取得できるのはautoreleaseなUIImageなので、間違ってreleaseしたりretainし忘れたりしないように気をつけてください。



■基本

[objc]
UIGraphicsBeginImageContextWithOptions(サイズ, 透過の有無(NOで透過有), スケール(0でデバイス固有));
//描画
UIImage *createdImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[/objc]



■特定のViewを画像として取得

layerを使うので
[objc]
#import <QuartzCore/CALayer.h>
[/objc]
が必要となります。

[objc]
UIView *view;
UIGraphicsBeginImageContextWithOptions(view.bounds.size,NO, 0);

CGContextRef contet = UIGraphicsGetCurrentContext();
[view.layer renderInContext:contet];

UIImage *createdImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[/objc]



■UIImageを描画
[objc]
UIImage *img;
UIGraphicsBeginImageContextWithOptions(img.size, NO, 0);

CGRect frame = CGRectMake(0, 0, img.size.width, img.size.height);
CGContextRef context = UIGraphicsGetCurrentContext();
//上下逆対策
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0, img.size.height );
CGContextScaleCTM(context, 1, -1);

CGContextDrawImage(context, frame, img.CGImage);

CGContextRestoreGState(context);

UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[/objc]
※普通に描画すると上下が逆になるので座標変換をする



■座標を用いて幾何学図形を書く(がんばれば複雑な図形も)
例)中心(50,50), 半径50の円を書く
[objc]
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
CGContextRef contet = UIGraphicsGetCurrentContext();

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)];
[[UIColor blackColor] setFill];
[path fill];

UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[/objc]



■影をつける
[objc]
UIImage *img;
UIGraphicsBeginImageContextWithOptions(size, NO, 0);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextSetShadow(context,影の向き, 影のぼけ具合);
//描画
CGContextRestoreGState(context);

UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[/objc]



■マスクする

白黒画像をマスク用に用意してあげると、マスク用の画像の白い部分を透明にした画像が作れます。
黒い部分だけ残した画像ではありません。この違いは色がついたりアルファの入った画像をマスク画像にしたときにはっきりとわかります。

[objc]
- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage * )maskImage {

CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef),
NULL,
false);

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
CGImageRelease(mask);
UIImage *maskedImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);
return maskedImage;
}

[/objc]

だいたい使ったのはこれぐらいでした。
大抵のことはこれらの組み合わせですべて出来ると思います。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>