Laden...

Formatierten Text in ein Image zeichnen (WPF)

Erstellt von el_vital vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.364 Views
E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren
Formatierten Text in ein Image zeichnen (WPF)

Hallo,

gibt es eine möglichkeit einen Text so wie es in einem Label formatiert worden ist in ein Bitmap zeichnen? Also nicht einfach g.DrawString?

bei "Windows Forms Anwendungen" gab es ja label.DrawToBitmap Funktion. Es ist bei WPF leider nicht mehr bei dem Label dabei. Gibt es da eine andere Lösung?

582 Beiträge seit 2008
vor 14 Jahren

Gruß dat Tala

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren

Danke. Das habe ich schon gesehen, aber leider verstehe ich nicht wie ich damit auf ein Bild zeichnen kann.

U
1.578 Beiträge seit 2009
vor 14 Jahren

evtll hilft das hier weiter: http://www.vistax64.com/avalon/103701-using-wpf-generate-image.html
da wird zwar ein neues image erstellt - nur das
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(rtb));
sieht aus als wenn man da auch bestehendes hinzufuegen kann

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren

ok, ich habe es hin bekommen den Text aus einer TextBox auf ein Image mit folgendem Quelltext zu übertragen.


    private void buttonSpeichern_Click(object sender, RoutedEventArgs e)
        {

            // Text to render on the image.
            FormattedText text = new FormattedText(textBoxLogo.Text, new CultureInfo("en-us"),
                                                   textBoxLogo.FlowDirection,
                    new Typeface(textBoxLogo.FontFamily, textBoxLogo.FontStyle, textBoxLogo.FontWeight,
                      textBoxLogo.FontStretch),
                    textBoxLogo.FontSize,
                    textBoxLogo.Foreground);

            // The Visual to use as the source of the RenderTargetBitmap.
            DrawingVisual drawingVisual = new DrawingVisual();
            DrawingContext drawingContext = drawingVisual.RenderOpen();
            //  bi ist ein BitmapImage
            drawingContext.DrawImage(bi, new Rect(0, 0, bi.Width, bi.Height));
            drawingContext.DrawText(text, new Point(bi.Height / 2, 0));
            drawingContext.Close();

            RenderTargetBitmap rtb = null;
            // drawingVisual rendern
            rtb = new RenderTargetBitmap((int)bi.Width, (int)bi.Height, 96, 96, PixelFormats.Pbgra32);
            rtb.Render(drawingVisual);
            rtb.Freeze();
            image1.Source = rtb;
        }

Das Problem dabei ist die nicht passende Auflösung. Der kleine Text auf dem Bild ist die TextBox, der große ist der übertragene Text. Ich möchte aber, dass der gezeichnete Text genau so aussieht wie der Text der TextBox im Moment des Zeichnens. Hat jemand eine Idee wie man die Auflösung angleichen kann?

Hier ein Bild:

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren

mit rtb.Render(drawingVisual); wird auch das gezeichnete Image extrem unscharf. Finde leider keine Lösung für dieses Problem.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren

ok, die Unschärfe kam, weil man (bi.PixelWidth, bi.PixelHeight) und nicht (bi.Width, bi.Height) verwenden muss. Aber wie die Größe des Textes angepasst werden kann ist mir noch unklar.

E
el_vital Themenstarter:in
346 Beiträge seit 2007
vor 14 Jahren

Weiß vielleicht jemand wie ich die Position einer TextBox über einem Image herausfinden kann?? Im Designer sind bei der Textbox alle vier Margin Werte eingetragen. Wenn das Programm läuft ist die Oberfläche größer als im Designer die Margin Werte müßten sich also vergrößert haben, da die Abstände auf allen vier Seiten zu dem Rand größer sind. Die Margin werte bleiben aber zur Laufzeit immer gleich, unabhängig von der Größe des Fensters. Deswegen ist es unmöglich die Position der Textbox auf der Oberfläche zur Laufzeit genau zu bestimmen. 🙄