24/7 twenty-four seven

iOS/OS X application programing topics.

マスクを使って画像を切り抜く

How to Mask an Image [iOS developer:tips];

白黒の画像をマスクとして、画像を任意の形に切り抜くことが出来ます。
上記の例はとても単純ですが、マスク画像を工夫すれば、複雑な形の画像もプログラムから簡単に作成できます。

//元画像
UIImage *iconImage = [UIImage imageNamed:@"apple-touch-icon.png"];
//マスク画像
UIImage *maskImage = [UIImage imageNamed:@"mask.png"];

//マスク画像をCGImageに変換する
CGImageRef maskRef = maskImage.CGImage; 
//マスクを作成する
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);

//マスクの形に切り抜く
CGImageRef masked = CGImageCreateWithMask([iconImage CGImage], mask);
//CGImageをUIImageに変換する
UIImage *maskedImage = [UIImage imageWithCGImage:masked];

CGImageRelease(mask);
CGImageRelease(masked);

NSDateFormatterはフォーマットする前にロケールを設定すべき?

日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven

前に日本語環境ではフォーマットした時刻の表記に「午前・午後」が含まれてしまって使いにくいと書いたのですが、コメントにて、フォーマットする前にロケール(NSLocale)を設定すると良いと教えていただいたので、試してみました。

日本語だとおかしい、というより、locale を設定していないとだめみたいです。ja_JP を setLocale で設定すればちゃんと値が返ってきます。

日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven]


前回と同じコードにロケールを設定するコードを追加して、実験してみました。

NSDate *now = [[NSDate date] retain];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

//ロケールを設定
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]];

[dateFormatter setDateFormat:@"hh:mm:ss"];
NSString *formattedDate = [dateFormatter stringFromDate:now];
NSLog(@"%@", formattedDate);

[dateFormatter setDateFormat:@"HH:mm:ss"];
formattedDate = [dateFormatter stringFromDate:now];
NSLog(@"%@", formattedDate);

[dateFormatter setDateFormat:@"KK:mm:ss"];
formattedDate = [dateFormatter stringFromDate:now];
NSLog(@"%@", formattedDate);

[dateFormatter setDateFormat:@"kk:mm:ss"];
formattedDate = [dateFormatter stringFromDate:now];
NSLog(@"%@", formattedDate);
2009-04-19 20:48:25.665 DateTest[3173:20b] 08:48:25
2009-04-19 20:48:25.671 DateTest[3173:20b] 20:48:25
2009-04-19 20:48:25.676 DateTest[3173:20b] 08:48:25
2009-04-19 20:48:25.682 DateTest[3173:20b] 20:48:25

確かに、まともな形式で返ってきます。

とすると、dateFormatterのlocaleは初期値として何が入っているのでしょうか?

調べてみました。

NSLog(@"%@", [dateFormatter locale]);
NSLog(@"%@", [NSLocale currentLocale]);
NSLog(@"%@", [NSLocale systemLocale]);

結果は次のように出力されました。

2009-04-19 21:36:21.287 DateTest[3385:20b] <NSCFLocale: 0x1178c0>
2009-04-19 21:36:21.295 DateTest[3385:20b] <NSCFLocale: 0x117050>
2009-04-19 21:36:21.306 DateTest[3385:20b] <NSCFLocale: 0x1178c0>

どうやら、インスタンス化した直後のdateFormatterにはcurrentLocaleが設定されているようです。

先述のdateFormatterに設定するロケールは、sysytemLocaleでもOKでした。