UIImageを使って、一部分だけが透明な穴が開いたような感じの画像を生成したいです。
どのようにすれば良いでしょうか?
ポイントが勿体無いからコメント欄を空けたほうがいいですよ
こちらには開発環境がないため正しいソースは提供できませが
たぶんmaskImageが間違ってる気がします。
問題を単純にするためサンプルのようにマスク画像を
UIImage *maskImage = [UIImage imageNamed:@"mask.png"];
のように直接指定して試してください。
曇りガラスを指で擦ったような画像を作成する流れ
用意するもの
●オリジナルの画像
●曇った画像(アルファブレンド済みの画像)
●マスク画像1(白四角の中に黒丸)実際には指で擦った部分のイメージ
●マスク画像2(黒四角の中に白丸)実際には指で擦ってない部分のイメージ
(マスク画像1とマスク画像2は白と黒が反転したものなのでプログラムでも作れます)
まず、オリジナルの画像とマスク画像1でマスク済みの画像Aを作成する。
(画像Aはマスク画像1で黒だった部分がオリジナルの画像になっている)<==指で擦った部分のイメージ
次に曇った画像とマスク画像2でマスク済みの画像Bを作成する。
(画像Bはマスク画像2で黒だった部分が曇った画像になっている)<==擦ってない部分のイメージ
最後に画像Aと画像Bを合成すると曇りガラスを指で擦ったような画像になる。
合成する方法はヘルプにあると思います。
切り抜かれたほうの画像が欲しいです。切り抜かれた方の画像はどのように抽出できますでしょうか?
コメント欄が開いてないので、こちらで失礼します。
サンプルにある、白四角の中に黒丸の画像と逆の
黒四角の中に白丸とすればいいと思います。
簡単に言うと、マスク画像で黒にしてる部分が残り
白の部分が消えると言う事です。
以下でうまくいきませんでした。何も表示されません。
CGPoint p = [[touches anyObject] locationInView:self];
UIImage* blackImage = [UIImage imageNamed:@"black.png"];
UIImage *whiteImage = [UIImage imageNamed:@"white.png"];
CGRect rect = CGRectMake(0, 0, 320.0f, 480.0f);
CGRect whiteRect = CGRectMake(p.x, p.y, whiteImage.size.width, whiteImage.size.height);
UIGraphicsBeginImageContext(blackImage.size);
[blackImage drawInRect:rect];
[whiteImage drawInRect:whiteRect blendMode:kCGBlendModeNormal alpha:1.0];
UIImage *maskImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef maskRef = maskImage.CGImage;
// マスクを作成する
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
// マスクの形に切り抜く
UIImage *originalImage = [UIImage imageNamed:@"test.png"];
CGImageRef masked = CGImageCreateWithMask(originalImage.CGImage, mask);
// コンテキストに描画する
CGContextDrawImage(context, rect, masked);
// 表示する
[self setNeedsDisplay];
ポイントが勿体無いからコメント欄を空けたほうがいいですよ
こちらには開発環境がないため正しいソースは提供できませが
たぶんmaskImageが間違ってる気がします。
問題を単純にするためサンプルのようにマスク画像を
UIImage *maskImage = [UIImage imageNamed:@"mask.png"];
のように直接指定して試してください。
曇りガラスを指で擦ったような画像を作成する流れ
用意するもの
●オリジナルの画像
●曇った画像(アルファブレンド済みの画像)
●マスク画像1(白四角の中に黒丸)実際には指で擦った部分のイメージ
●マスク画像2(黒四角の中に白丸)実際には指で擦ってない部分のイメージ
(マスク画像1とマスク画像2は白と黒が反転したものなのでプログラムでも作れます)
まず、オリジナルの画像とマスク画像1でマスク済みの画像Aを作成する。
(画像Aはマスク画像1で黒だった部分がオリジナルの画像になっている)<==指で擦った部分のイメージ
次に曇った画像とマスク画像2でマスク済みの画像Bを作成する。
(画像Bはマスク画像2で黒だった部分が曇った画像になっている)<==擦ってない部分のイメージ
最後に画像Aと画像Bを合成すると曇りガラスを指で擦ったような画像になる。
合成する方法はヘルプにあると思います。
「回答受付中はコメントをつけられません。」になっています。
マスク画像を直接指定で実行してみたのですが、
マスク画像が
CGContextDrawImage(context, rect, masked);
のrect(320×480)にあわせて引き伸ばされてしまいます。
参考URLものはマスク画像も元画像も同じ大きさなので、うまくいっているように思います。
しかも、白でマスクしたらその部分が消去されるのですが、黒でマスクしても黒以外の部分は消去されません。
何卒よろしくお願いします。
「回答受付中はコメントをつけられません。」になっています。
マスク画像を直接指定で実行してみたのですが、
マスク画像が
CGContextDrawImage(context, rect, masked);
のrect(320×480)にあわせて引き伸ばされてしまいます。
参考URLものはマスク画像も元画像も同じ大きさなので、うまくいっているように思います。
しかも、白でマスクしたらその部分が消去されるのですが、黒でマスクしても黒以外の部分は消去されません。
何卒よろしくお願いします。