先日書いた影の描画についての続編です。
参照にしたサイト(http://cocoadays.blogspot.com/2010/06/bezel12.html)では、そもそもアルファ値の画像でもとの画像を切り抜く方法を紹介していました。
ならば、影も切り抜けばいいんじゃん!と思いつきました。
がう と同じ大きさの真っ黒のpng画像を用意し、それを切り抜こうというわけです。
真っ黒の画像はpng24という形式に保存しました。
そして、コードはほぼ丸写しのこんな感じ。
-(UIImage *)convShadowImage:(UIImage *)image { //切り取って影にするもとの画像 CGImageRef shadowImage = [UIImage imageNamed:@"shadow.png"].CGImage; //引数のimageからmaskを作る CGRect rect = CGRectMake(0.0, 0.0, image.size.width, image.size.height); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); CGContextRef alphaContext = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaOnly); CGContextDrawImage(alphaContext, rect, [image CGImage]); CGImageRef alphaImage = CGBitmapContextCreateImage(alphaContext); //maskをかける CGImageRef maskedImage = CGImageCreateWithMask( shadowImage, alphaImage ); // 作成したCGImageからUIImageを作成 UIImage* retImage = [UIImage imageWithCGImage:maskedImage]; CGColorSpaceRelease(colorSpace); CGContextRelease(alphaContext); CGImageRelease(alphaImage); CGImageRelease( maskedImage ); return retImage; }
でも、なんだかがんばって切り取ってる感じなんですよ。
結果の画像を明るくしてみると、こうなります。
黒い四角の上に、うっすらと がう の影が!
PNG24で保存しつつ、実際は透明部分が全くない真っ黒の画像なので、PNG24らしい情報が損失しているのかもしれません。
試しに、こんな画像を作ってみました。
黒から透明にグラデーションしている画像です。縦横サイズは同じなのに、容量は倍以上になりました。
shadow.pngで保存して試してみると・・・!
切り取れてます!
そして、iPhone3Gで実行しても!
同じ結果になりました!ここで感動しました!
画像についての基礎を理解してないので、なぜなのかはわかりません。
ただ、なんとなく「透明部分の情報があるかどうか」なのかなと思いました。
特にグラデーションは必要なくて、真っ黒の影が欲しいなと思ったので、端っこ1ピクセルだけ透明な画像を作ってみました。
容量は最初の真っ黒とほとんど変わりなくなりました。
・・・黒い画像ナシで同じことができるといいんですけどね。