none
WPFで、テキストのブラシに画像を使う方法を教えてください。 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    WPFで、テキストのブラシに画像を使う方法を教えてください。
    <TextBox.Foreground>
    <Image Name="photo"/>
    </TextBox.Foreground>

    photo.Source = new BitmapImage(new Uri(fileName));
    としてみたところ、
    プロパティForegroundは型Imageの値をサポートしません。
    とエラーです。

    Imageを楕円とかでクリップするには、
    <Image Name="photo" >
    <Image.Clip>
    <EllipseGeometry RadiusX="120" RadiusY="80" Center="140,100" />
    </Image.Clip>
    </Image>
    とからしいのですが…。

    2010年11月28日 8:09

回答

すべての返信

  • WPF のブラシの概要

    上記ページを参考にしてみてください。

    • 回答としてマーク d-kot 2010年11月28日 10:59
    2010年11月28日 10:22
  • Hongliangさん、ありがとうございます。
    できました。
    ImageBrush imagebrush = new ImageBrush();
    imagebrush.ImageSource = new BitmapImage(new Uri(fileName));
    text.Foreground = imagebrush;
    とすることでできました。

    ところで、これを透過のpng画像として保存したいのですが、
    それにはどうすればよいでしょう?


    System.Drawing.Bitmap Image = new System.Drawing.Bitmap();
    Image.Save("path", System.Drawing.Imaging.ImageFormat.Png);

    背景が白としてその背景を透過色(アルファチャンネル)に設定するのかと思うのですが、その方法がよくわかりません。
    あと、いま描画したのはテキストなので、それをimageとして保存するには???

    2010年11月28日 10:59
  • えーと。なんというか、超えなくてはいけないハードルがいくつかあるようです。

    まず、System.Drawing 名前空間下のクラスは、Windows の GDI+ という画像ライブラリを .NET で簡単に扱えるようにした物です。Windows Forms アプリケーションが画像表示等に標準で使用するライブラリでもあります(たとえば、System.Windows.Forms.Control の BackgroundImage は System.Drawing.Image 型です)。

    それに対し、WPF が標準で使用する画像ライブラリは System.Windows.Media.Imaging 名前空間下に属しています。ここのクラスは、WIC という、GDI+ とは別の Windows の画像ライブラリをラップした物であり、互換性はほぼ存在していません(基本的に画像ファイルレベルまで落とし込む必要があります)。

    特に WPF の要素を画像として保存したいという場合、System.Drawing は使用できません。System.Windows.Media.Imaging の方を使用することになります。

    具体的には、RenderTargetBitmap オブジェクトを用意し、Render メソッドを使って要素を描画し、png 画像なら PngBitmapEncoder クラスを使って Save する、ということになるでしょう。

    2010年11月28日 11:48
  • Hongliangさん、ありがとうございます。
    いくつもハードルがあるのは、なんとなく想像できてました。
    ・RenderTargetBitmapオブジェクトを用意する。
    ・Renderメソッドを使って要素を描画する。
    ・PngBitmapEncoderクラスを使ってSaveする。
    ですね。
    さて、まず、
    ・RenderTargetBitmapオブジェクトを用意する。
    です。
    ツールボックスを見てもないので、
    RenderTargetBitmap bmp = new RenderTargetBitmap();
    とここまではできました。

    RenderTargetBitmapで検索したら、テキストをイメージでレンダリングする方法というのがあったので、まずはそれを取得。

    ImageBrush imagebrush = new ImageBrush();
    imagebrush.ImageSource = new BitmapImage(new Uri(fileName));

    Image image = new Image();
    FormattedText text = new FormattedText("ABC",
    new CultureInfo("en-us"),
    FlowDirection.LeftToRight,
    new Typeface("meiryo", FontStyles.Normal, FontWeights.Normal, new FontStretch()), 40,
    imagebrush);

    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContent = drawingVisual.RenderOpen();
    drawingContent.DrawText(text, new Point(2, 2));
    drawingContent.Close();

    RenderTargetBitmap bmp = new RenderTargetBitmap(180, 180, 120, 96, PixelFormats.Pbgra32);
    bmp.Render(drawingVisual);
    image.Source = bmp;

    // Add Image to the UI
    canvas.Children.Add(image);

    とやってみました。

     FormattedTextは、テキスト、カルチャ、フロー方向、typeフェイス、フォントサイズ、ブラシを指定するそうなのですが、この行でエラー。
    ・型CultureInfoが見つからない
    ・stringをSystem.Windows・Media.FontFamilyに変換できない。
    ・System.Windows.Media.Typeface.Typefaceには無効な引数がある。
    とのこと。
    さて。どうしたものでしょうか。

     

     

    2010年11月28日 14:28