私はUIBezierPathを使用してユーザーがその一部を選択したイメージで作業しています。その選択に含まれていないものをすべて削除/クリア/透明化するにはどうすればよいですか?iOS UIImageをパスにクリップ
11
A
答えて
20
1つのパスで非常に簡単です。ただ、クリッピングパスとしてパス設定:あなたは複数のパスの組合を使用したい場合は
- (UIImage *)maskImage:(UIImage *)originalImage toPath:(UIBezierPath *)path {
UIGraphicsBeginImageContextWithOptions(originalImage.size, NO, 0);
[path addClip];
[originalImage drawAtPoint:CGPointZero];
UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return maskedImage;
}
をクォーツは、直接2つのパスの和集合を計算する任意の機能を持っていないので、それは、難しいです。一つの方法は、マスクに一つによって各パスいずれかを充填し、その後、マスクを介して画像を描画することである。
- (UIImage *)maskedImage
{
CGRect rect = CGRectZero;
rect.size = self.originalImage.size;
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); {
[[UIColor blackColor] setFill];
UIRectFill(rect);
[[UIColor whiteColor] setFill];
for (UIBezierPath *path in self.paths)
[path fill];
}
UIImage *mask = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); {
CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage);
[self.originalImage drawAtPoint:CGPointZero];
}
UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return maskedImage;
}
0
I組合複数のパスのコードを試みたが、それは動作しません。
実際には、パスの和集合が重複しない場合、別のパスに1つのパスを追加して最終パスで切り取ります。
UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0);
[path1 appendPath:path2]; // append path2 to path1
[path1 addClip];
[originalImg drawAtPoint:CGPointZero];
result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
関連する問題
- 1. 描画パスにクリップ
- 2. iOSの - UIImage
- 3. UIImageをクリップするUIBezierPathをアニメ化する
- 4. ios、UIImageをMultipartFileに変換する
- 5. UIImageでiOSカラーを透明にする
- 6. UIImageからCurrentBackgroundImageパスを取得
- 7. UIImageから別のUIImageに任意のパスをコピーする方法
- 8. iOS作物UIImageの一部
- 9. iOS UIImageのプリズム効果
- 10. UiTapGesturerecognizerを使用しているときにUIImageがクリップされる
- 11. iOSのUIImageからbase64にエンコードする
- 12. self.tabBar.shadowImage = [UIImage new]; iOSの10の前にiOSの10
- 13. 同じパスにUIImageを再保存する方法
- 14. Qt QGraphicsSceneで閉じていないパスをクリップする方法
- 15. Xamarin iOSでストリームをUIImageに変換するには?
- 16. クリップ
- 17. iOSでUIImageをプログレッシブJPEG形式に保存する方法は?
- 18. iOSのUIImageでrectを削除するには?
- 19. iOS-Chartsポイントの横にUIImageを置く方法
- 20. UIImageのすべての4面に影を付けるiOS 6.0
- 21. iOSの相対パス
- 22. StringファイルのパスからUIImageを使用する
- 23. iOS:iOS10のUIImage nil
- 24. IOSのボタンの代わりにUIImageで登録する方法
- 25. iOSのスクロールビューにUIimageが表示されない
- 26. ios awkard image loading(uiimageviewにuiimageするためのURL)
- 27. なぜSVG feColorMatrix + <use xlink:href = "#" />がクリップされたパスになりますか?
- 28. ピクセルを削除するUIImageへのパスを追加するには?
- 29. iOSアプリのWebViewのSVGクリップ経路問題
- 30. クリップは
ワウ。それがとても簡単だったという考えはありませんでした。私はすべての間違った場所を探していた。クリッピングが描画領域を制限します。 –
私は複数のnsbezierpathsを持っています。あるいは、ストロークがお互いの上にあるnsbezierpathを1つ持っていれば、これはうまくいきません。 –
申し訳ありませんが、これは実際には機能しません。私は複数のUIBezierPathを持っていますが、必ずしもクリップが望むシェイプを表すのではなく、選択されています。複数のUIBezierPathをクリッピングすると、複数のUIBezierPathが重なって表示され、正しいイメージが返されません。 –