ブラシの変換の概要

更新 : 2007 年 11 月

Brush クラスは、RelativeTransformTransform の 2 つの変換プロパティを提供します。これらのプロパティを使用すると、ブラシのコンテンツの回転、拡大縮小、傾斜、および平行移動を行うことができます。ここでは、2 つのプロパティの違いについて説明し、それらの使用例を示します。

必要条件

このトピックを理解するには、変換するブラシの機能を理解する必要があります。LinearGradientBrushRadialGradientBrush については、「純色およびグラデーションによる塗りつぶしの概要」を参照してください。ImageBrushDrawingBrush、または VisualBrush については、「イメージ、描画、およびビジュアルによる塗りつぶし」を参照してください。また、「変換の概要」で説明されている 2D 変換にも精通している必要があります。

Transform プロパティと RelativeTransform プロパティの違い

ブラシの Transform プロパティに変換を適用する場合、ブラシのコンテンツをその中心を軸に変換するときは、塗りつぶされる領域のサイズを認識しておく必要があります。塗りつぶされる領域は、幅が 200 デバイス非依存ピクセルで、高さが 150 であると仮定します。RotateTransform を使用して、ブラシの中心を軸に出力を 45 度回転した場合は、RotateTransformCenterX に 100、CenterY に 75 を指定したことになります。

ブラシの RelativeTransform プロパティに変換を適用する場合は、この変換がブラシに適用されてから、塗りつぶされる領域に出力がマップされます。ブラシのコンテンツが処理および変換される順序を次に示します。

  1. ブラシのコンテンツを処理します。これは、GradientBrush では、グラデーション領域を決定することを意味します。TileBrush では、ViewboxViewport にマップされます。これがブラシの出力になります。

  2. ブラシの出力を 1 × 1 の変換四角形に投影します。

  3. ブラシの RelativeTransform がある場合は、それを適用します。

  4. 塗りつぶす領域に、変換された出力を投影します。

  5. ブラシの Transform がある場合は、それを適用します。

ブラシの出力が 1 × 1 の四角形にマップされている間に RelativeTransform が適用されるため、変換の中心とオフセット値は相対的に表されます。たとえば、RotateTransform を使用して、ブラシの中心を軸に出力を 45 度回転した場合は、RotateTransformCenterX に 0.5、CenterY に 0.5 を指定したことになります。

次の図は、RelativeTransform プロパティと Transform プロパティを使用して 45 度回転された複数のブラシの出力を示しています。

RelativeTransform プロパティと Transform プロパティ

TileBrush での RelativeTransform の使用

タイル ブラシは他のブラシより複雑であるため、これに RelativeTransform を適用すると予期しない結果が生じる可能性があります。たとえば、次のイメージを使用するとします。

ソース イメージ

次の例では、ImageBrush を使用して、四角形領域を上のイメージで塗りつぶします。RotateTransformImageBrush オブジェクトの RelativeTransform プロパティに適用し、Stretch プロパティを UniformToFill に設定します。この設定によって、イメージが引き伸ばされて四角形を完全に塗りつぶす際に、イメージの縦横比が保持されます。

<Rectangle Width="200" Height="100" Stroke="Black" StrokeThickness="1">
  <Rectangle.Fill>
    <ImageBrush Stretch="UniformToFill">
      <ImageBrush.ImageSource>
        <BitmapImage UriSource="sampleImages\square.jpg" />
      </ImageBrush.ImageSource>
      <ImageBrush.RelativeTransform>
        <RotateTransform CenterX="0.5" CenterY="0.5" Angle="90" />
      </ImageBrush.RelativeTransform>
    </ImageBrush>
  </Rectangle.Fill>
</Rectangle>

この例を実行すると、次の出力が生成されます。

変換された出力

ブラシの StretchUniformToFill に設定された場合でも、イメージがゆがめられます。これは、ブラシの ViewboxViewport にマップされた後に相対変換が適用されるためです。プロセスの手順を次に示します。

  1. ブラシの Stretch を設定して、ブラシのコンテンツ (Viewbox) を基本タイル (Viewport) に投影します。

    ビューポートに合わせて Viewbox を拡大

  2. 基本タイルを 1 × 1 の変換四角形に投影します。

    ビューポートを変換四角形に割り当て

  3. RotateTransform を適用します。

    相対変換の適用

  4. 塗りつぶす領域に、変換された基本タイルを投影します。

    変換されたブラシを出力領域に反映

例 : ImageBrush を 45 度回転する

次の例では、RotateTransformImageBrushRelativeTransform プロパティに適用しています。RotateTransform オブジェクトの CenterX プロパティおよび CenterY プロパティは、コンテンツの中心点の相対座標である 0.5 に設定されています。その結果、ブラシの内容はその中心を軸にして回転します。

//
// Create an ImageBrush with a relative transform and
// use it to paint a rectangle.
//
ImageBrush relativeTransformImageBrush = new ImageBrush();
relativeTransformImageBrush.ImageSource =
    new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));

// Create a 45 rotate transform about the brush's center
// and apply it to the brush's RelativeTransform property.
RotateTransform aRotateTransform = new RotateTransform();
aRotateTransform.CenterX = 0.5; 
aRotateTransform.CenterY = 0.5;
aRotateTransform.Angle = 45;
relativeTransformImageBrush.RelativeTransform = aRotateTransform;

// Use the brush to paint a rectangle.
Rectangle relativeTransformImageBrushRectangle = new Rectangle();
relativeTransformImageBrushRectangle.Width = 175;
relativeTransformImageBrushRectangle.Height = 90;
relativeTransformImageBrushRectangle.Stroke = Brushes.Black;
relativeTransformImageBrushRectangle.Fill = relativeTransformImageBrush;

<Rectangle Width="175" Height="90" Stroke="Black">
  <Rectangle.Fill>
    <ImageBrush ImageSource="sampleImages\pinkcherries.jpg">
      <ImageBrush.RelativeTransform>
        <RotateTransform CenterX="0.5" CenterY="0.5" Angle="45" />
      </ImageBrush.RelativeTransform>
    </ImageBrush>
  </Rectangle.Fill>
</Rectangle>

次の例でも RotateTransformImageBrush に適用していますが、RelativeTransform プロパティの代わりに Transform プロパティを使用しています。ブラシをその中心を軸に回転するには、RotateTransform オブジェクトの CenterX および CenterY を絶対座標に設定する必要があります。ブラシで描画される四角形は 175 × 90 ピクセルであるため、その中心点は (87.5, 45) になります。

//
// Create an ImageBrush with a transform and
// use it to paint a rectangle.
//
ImageBrush transformImageBrush = new ImageBrush();
transformImageBrush.ImageSource =
    new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));

// Create a 45 rotate transform about the brush's center
// and apply it to the brush's Transform property.
RotateTransform anotherRotateTransform = new RotateTransform();
anotherRotateTransform.CenterX = 87.5;
anotherRotateTransform.CenterY = 45;
anotherRotateTransform.Angle = 45;
transformImageBrush.Transform = anotherRotateTransform;

// Use the brush to paint a rectangle.
Rectangle transformImageBrushRectangle = new Rectangle();
transformImageBrushRectangle.Width = 175;
transformImageBrushRectangle.Height = 90;
transformImageBrushRectangle.Stroke = Brushes.Black;
transformImageBrushRectangle.Fill = transformImageBrush;

<Rectangle Width="175" Height="90" Stroke="Black">
  <Rectangle.Fill>
    <ImageBrush ImageSource="sampleImages\pinkcherries.jpg">
      <ImageBrush.Transform>
        <RotateTransform CenterX="87.5" CenterY="45" Angle="45" />
      </ImageBrush.Transform>
    </ImageBrush>
  </Rectangle.Fill>
</Rectangle>

次の図は、変換していないブラシ、RelativeTransform プロパティに変換を適用したブラシ、および Transform プロパティに変換を適用したブラシを示しています。

ブラシ RelativeTransform と変換の設定

この例は、より大きなサンプルの一部です。サンプル全体については、「ブラシのサンプル」を参照してください。ブラシの詳細については、「WPF のブラシの概要」を参照してください。

参照

概念

純色およびグラデーションによる塗りつぶしの概要

イメージ、描画、およびビジュアルによる塗りつぶし

変換の概要

参照

Transform

RelativeTransform

Transform

Brush