Still Life

残念IT系母ちゃん。旦那さん、娘1歳、猫の4人暮らし。

影を描画したいのに/その2

先日書いた影の描画についての続編です。


参照にしたサイト(http://cocoadays.blogspot.com/2010/06/bezel12.html)では、そもそもアルファ値の画像でもとの画像を切り抜く方法を紹介していました。

ならば、影も切り抜けばいいんじゃん!と思いつきました。

がう と同じ大きさの真っ黒のpng画像を用意し、それを切り抜こうというわけです。
真っ黒の画像はpng24という形式に保存しました。
f:id:Aodrey:20110724020423p:image:w320

そして、コードはほぼ丸写しのこんな感じ。

-(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;
}

結果はこうでしたorz
f:id:Aodrey:20110724020825p:image

でも、なんだかがんばって切り取ってる感じなんですよ。
結果の画像を明るくしてみると、こうなります。
f:id:Aodrey:20110724021035p:image
黒い四角の上に、うっすらと がう の影が!


PNG24で保存しつつ、実際は透明部分が全くない真っ黒の画像なので、PNG24らしい情報が損失しているのかもしれません。
試しに、こんな画像を作ってみました。
f:id:Aodrey:20110724021305p:image:w320
黒から透明にグラデーションしている画像です。縦横サイズは同じなのに、容量は倍以上になりました。

shadow.pngで保存して試してみると・・・!
f:id:Aodrey:20110724021611p:image
切り取れてます!

そして、iPhone3Gで実行しても!
f:id:Aodrey:20110724021506j:image:w320
同じ結果になりました!ここで感動しました!


画像についての基礎を理解してないので、なぜなのかはわかりません。
ただ、なんとなく「透明部分の情報があるかどうか」なのかなと思いました。


特にグラデーションは必要なくて、真っ黒の影が欲しいなと思ったので、端っこ1ピクセルだけ透明な画像を作ってみました。
容量は最初の真っ黒とほとんど変わりなくなりました。

結果は、
f:id:Aodrey:20110724022723p:image
f:id:Aodrey:20110724022615j:image:w320
両方バッチリ!


・・・黒い画像ナシで同じことができるといいんですけどね。