1

CGで描いた長方形の幅と色を変えようとしています。次の関数では、画像を別の色でマスキングしていますが、幅を変更するにはどうすればよいですか?

- (void)colorImage:(UIImage *)origImage withColor:(UIColor *)color withWidth:(float) width
{
UIImage *image = origImage;
NSLog(@"%f", width);
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, width);
CGContextClipToMask(context, rect, image.CGImage);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImage *flippedImage = [UIImage imageWithCGImage:img.CGImage
                                            scale:1.0 orientation:          UIImageOrientationDownMirrored];

self.image = flippedImage;
}
4

1 に答える 1

8

で線幅を設定しCGContextSetLineWidth(context, width)ます。

これによる効果が見られない理由は、何もなでていないからです。線幅はストロークで描かれた線に適用されます。ストロークではなく、塗りつぶしを行っており、塗りつぶしには幅を与える線がありません。

長方形の周りに境界線を置きたい場合は、ストロークする必要があります。それが、ある図形の周囲にずっと線を引くものです。

次の 3 つのオプションがあります。

  • を呼び出しCGContextSetLineWidthてからCGContextStrokeRect.
  • コールしCGContextStrokeRectWithWidthます。
  • を呼び出しCGContextSetLineWidthてからCGContextAddRect(四角形を現在のパスに追加するため)、次にCGContextDrawPathを呼び出しkCGPathFillStrokeます。(または、必要に応じてAddRect前に呼び出しSetLineWidthます。両方とも前に発生する必要があるだけですDrawPath。)

ストロークはパス アウトラインの中央に配置されるため、ストロークの半分がパス/長方形の内側になり、半分が外側になることに注意してください。線の幅が 1 ピクセルの場合、これは線が半分透明になったように見えます (「半分のピクセル」を表す方法が他にないため)。線の幅が偶数ピクセルで、コンテキスト (またはビュー) の境界全体をストロークすると、線の内側の半分しか表示されません。

また、本当に塗りつぶすつもりだったのか、それともストロークだけが目的だったのかを判断する必要があります。

于 2013-06-17T02:43:10.420 に答える