1

Core Graphicsを使用して、黒い背景に単純なグリッドパターンを描画しようとしています。グリッド線は緑色になります。現在、画像コンテキストで作成および描画しており、結果の画像を使用してビューの背景をパターン化しています。

    CGFloat gridSize = 45;
    UIGraphicsBeginImageContext(CGSizeMake(gridSize, gridSize));

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(ctx);

    // Create black background fill.
    CGContextSetFillColorWithColor(ctx, [[UIColor colorWithRed:0.0 
                                                         green:0.0
                                                          blue:0.0
                                                         alpha:1.0] CGColor]);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, gridSize, 0);
    CGContextAddLineToPoint(ctx, gridSize, gridSize);
    CGContextAddLineToPoint(ctx, 0, gridSize);
    CGContextAddLineToPoint(ctx, 0, 0);
    CGContextFillPath(ctx);

    // Set context variables for line drawing.
    CGContextSetBlendMode(ctx, kCGBlendModeNormal);
    CGContextSetStrokeColorWithColor(ctx, [[UIColor colorWithRed:0.0 
                                                           green:1.0
                                                            blue:0.0
                                                           alpha:1.0] CGColor]);
    CGContextSetLineWidth(ctx, 1);

    // Draw top and bottom grid lines.
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextAddLineToPoint(ctx, gridSize, 0);
    CGContextMoveToPoint(ctx, gridSize, gridSize);
    CGContextAddLineToPoint(ctx, 0, gridSize);
    CGContextStrokePath(ctx);

    // Draw left and right grid lines.
    CGContextMoveToPoint(ctx, gridSize, 0);
    CGContextAddLineToPoint(ctx, gridSize, gridSize);
    CGContextMoveToPoint(ctx, 0, gridSize);
    CGContextAddLineToPoint(ctx, 0, 0);
    CGContextStrokePath(ctx);

    // Draw a "cross" in the center of the image to troubleshoot blending.
    CGContextMoveToPoint(ctx, 20, 20);
    CGContextAddLineToPoint(ctx, 40, 20);
    CGContextStrokePath(ctx);

    CGContextMoveToPoint(ctx, 30, 10);
    CGContextAddLineToPoint(ctx, 30, 30);
    CGContextStrokePath(ctx);

    UIGraphicsPopContext();

    UIImage *gridImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    // Set background color to a pattern based on the drawn image.
    [self setBackgroundColor:[[UIColor alloc] initWithPatternImage:gridImage]];

ただし、このコードは次のようになります。

グリッド線

線の交点で発生する明るい領域があることに注意してください。グリッドパターン内にいくらかランダムに配置された十字は、パターンのエッジの影響を受けていないときに明るい領域がまだ発生するかどうかをテストするために配置されました(実際に発生します)。

私が緩和したいのは、線の交差点にあるこれらの明るい領域です。ある種の目の錯覚を使って誤ってだまされていないことを確認するために、線の中央と交差点のピクセルの色を確認しました。

緑の線の中点のピクセル値:

  • R:0
  • G:129
  • B:0

2本の緑色の線の交点のピクセル値:

  • R:0
  • G:191
  • B:0

ブレンディングモードに関するAppleCoreGraphicsのドキュメントを確認し、デフォルトのブレンディングモードがkCGBlendModeNormal、で色をペイントするときにalpha = 1「背景を完全に覆い隠す」必要があること、および以前にペイントした色であることを確認しました。これはデフォルトのブレンディングモードですが、上記のコードで明示的に設定しましたが、それでもこれらの明るい正方形が表示されます。

代わりに私が期待しているのは、おそらくRGBプロファイルを使用して、均一な緑色の線を表示することです。

  • R:0
  • G:255
  • B:0

私は何が欠けていますか?

4

1 に答える 1

1

線は50%のアルファで描画されているように見えますが、指定された線幅の2倍です。これは、線幅が1ピクセルであるが、整数座標を使用して水平線または垂直線を描画する場合に発生します。

座標は、開始座標から終了座標までの無限に細い線を指定します。描画された線は、ストローク幅の半分だけ細い線の両側に伸びるはずです。あなたの場合、これは、線がグリッドの左と右、または上と下の半分のピクセルをカバーする必要があることを意味します。フルピクセルしか描画できないため、アルファは50%に削減され、代わりにフルピクセルが描画されます。

解決策は簡単です。すべての座標に0.5を追加します。

于 2012-06-25T17:26:43.760 に答える