6

UIImageView の周囲を暗くし、一部をそのままにしておきます (マスクで定義します)。

現在、マスクを定義して imageView.layer.mask を設定していますが、画像の残りの部分を暗くする代わりに、完全に削除しています。

私が望む効果のタイプの例:http://i.imgur.com/vVUiuyk.png

私が得ているものの例:http://i.imgur.com/5DTXo0S.png

参照ドキュメントには、マスクがレイヤーのアルファを使用することが記載されているため、マスクの不透明度を操作してみました。ただし、それは残したい部分の不透明度にのみ影響するようで、残りの画像はまだ完全に切り取られています。

誰かが私が間違っていることを指摘できますか? ありがとう。

これが私のコードです:

CAShapeLayer *mask = [CAShapeLayer layer];
GMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, nil, 1052, 448);
CGPathAddLineToPoint(path, nil, 2, 484);
CGPathAddLineToPoint(path, nil, 54, 1263);
CGPathAddLineToPoint(path, nil, 56, 1305);
CGPathAddLineToPoint(path, nil, 380, 1304);
CGPathAddLineToPoint(path, nil, 1050, 1311);
CGPathCloseSubpath(path);
mask.path = path;
CGPathRelease(path);

//mask.opacity = 0.5; //doesn't affect the surrounding portion, only the cut out area.
self.imageView.layer.mask = mask;
4

2 に答える 2

5

あなたが間違っているのは、そもそもレイヤーマスクを使用していることです。画像の領域をシェーディングまたは暗くしようとしています。それはレイヤーマスクが行うことではありません!基本的に、レイヤーマスクは既存のレイヤーを貫通し、その背後にあるものをすべて透けて見せます。それはまさにあなたが発見したものです:

代わりに完全に削除しています

はい、それがレイヤーマスクの機能だからです!それを望まないのなら、なぜレイヤーマスクを使用しているのですか?

必要なのは、最初の画像ビューの上に 2 番目の画像ビュー (または単なるサブレイヤー)配置することだけです。あなたが描くイメージが含まれています。半透明の濃い色で塗りつぶされている部分を除いて透明です。それはその背後にあるものを暗くします。クリッピング パスを使用して、濃い色で塗りつぶされない領域を定義します。

または、合成または場合によっては CIFilter を使用して、画像の上に描画することにより、画像ビューの画像を変更します。

于 2013-04-04T04:59:05.373 に答える