0

Stackoverflow でこれに対する答えが見つからないことに非常に驚きました。

SafariやMac App Storeアプリが通常画像アイコンとして使用するような、pdf形式のベクターパスがあります。

ここで、画像を作成してエクスポートするのではなく、塗りつぶしの色とカスタム シャドウをコードで指定したいと思います。これを行う方法がわかりませんでした。

影は機能しますが、塗りつぶしの色は機能しません。
誰でもこれを行う方法を教えてもらえますか?


現在のコード

[NSGraphicsContext saveGraphicsState];
{
    // Has no effect
    [[NSColor colorWithCalibratedRed:0.92f green:0.97f blue:0.98f alpha:1.00f] setFill];
    // Neither has this
    [[NSColor colorWithCalibratedRed:0.92f green:0.97f blue:0.98f alpha:1.00f] set];

    NSShadow *shadow = [NSShadow new];
    [shadow setShadowOffset:NSMakeSize(0, -1)];
    [shadow setShadowColor:[NSColor blackColor]];
    [shadow setShadowBlurRadius:3.0];
    [shadow set];

    [image drawInRect:imgRect 
             fromRect:NSZeroRect 
            operation:NSCompositeXOR 
             fraction:1.0 
       respectFlipped:YES 
                hints:nil];
}
[NSGraphicsContext restoreGraphicsState];
4

1 に答える 1

1

drawInRect:...イメージを「ありのままに」という意味で。塗りと線の設定は、プリミティブ操作のみに影響します。これについて考える良い方法は、ベクターまたはラスターのすべての画像が同じように動作する必要があることを理解することです。コンテキストに設定されている現在の塗りつぶしの色がラスターベースの画像の描画に影響を与えるのは奇妙ですよね? 同じ考えです -- イメージはイメージです。ベクトル画像には、それぞれ異なる塗りつぶしを持つ複数のパスが含まれる場合もあります。コンテキストで設定された塗りつぶしの色によってそれらが上書きされるのも意味がありません。

影は効果的に合成操作であるため、関係なく機能します。特定の影設定で特定の画像を描画すると、その画像がラスターベースであるか、それに相当するベクターであるかに関係なく、同じ影が生成されます。

要するに、画像の内容を変更したい場合は、画像からベクトルを抽出し、それらをプリミティブとして描画するコードを作成する必要があります。

または、塗りつぶされた領域を色で塗りつぶしたい場合は、ベクター画像を使用してコンテキストにマスクを作成し、コンテキストに色を設定して塗りつぶすことができます。それは望ましい効果を生み出すかもしれません。

于 2013-02-22T13:09:01.193 に答える