12

境界線や長方形のUIImageを変更できるアプリに取り組んでいます。境界線はさまざまですが、UIImageがはさみなどで切り取られたように見えます。

これを行うための最良の方法は何ですか?

私の最初の考えは、探している正しい境界線効果を備えた透明なPNGの束を準備し、それをUIImageのマスクとして使用することです。これは正しい道ですか?または、これを行うためのより柔軟なプログラムによる方法はありますか?

4

4 に答える 4

25

画像をマスクするために使用できるCoreGraphicsの呼び出しは次のとおりです。

//Mask Image
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"];
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask);
CGImageRelease(mask);

UIImage *maskedImage = [UIImage imageWithCGImage:masked];

CGImageRelease(masked);
于 2011-01-13T23:35:03.933 に答える
6

そのためには画像マスキングが必要です。私はそれを使用する方法と、自分のアプリケーションでどのように使用したかについてのチュートリアルを作成しました。

次のサンプルコードは、開始に役立つはずです。入力として元の画像とマスク画像が必要であり、出力としてマスクされた画像を返します。

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask
{
    CGImageRef imageReference = image.CGImage;
    CGImageRef maskReference = mask.CGImage;

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
                                             CGImageGetHeight(maskReference),
                                             CGImageGetBitsPerComponent(maskReference),
                                             CGImageGetBitsPerPixel(maskReference),
                                             CGImageGetBytesPerRow(maskReference),
                                             CGImageGetDataProvider(maskReference),
                                             NULL, // Decode is null
                                             YES // Should interpolate
                                             );

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
    CGImageRelease(imageMask);

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
    CGImageRelease(maskedReference);

    return maskedImage;
}
于 2012-11-08T10:22:51.613 に答える
3

うん、それはあなたがする必要があることのほとんどです。最善のアプローチは、コアグラフィックスを使用することです。Quartz 2Dプログラミングガイドには、画像を他の画像でマスクする方法を説明する記事があります。プロパティを介してオブジェクトCGImageRefから(これらのコアグラフィックスメソッドが使用する)を取得し、クラスメソッドを使用して変更された(マスクされた)オブジェクトから戻ることができます。UIImageCGImageUIImageCGImageRefUIImage+imageWithCGImage:

于 2011-01-13T23:01:58.660 に答える
0

パスを使用してこれを行う別の方法があります。円でそれを行い、閉じたパスで機能するように簡単に編集できるコードを投稿しました。

UIImageを楕円形または円形にトリミングするにはどうすればよいですか?

于 2013-02-25T00:43:44.667 に答える