2016-07-29 14 views
3

ich den folgenden Code verwenden, um Text in der Mitte eines Bildes einem WinkelTiling Text über das Bild in einem Winkel

Bitmap bmp = new Bitmap(pictureBox1.Image); 
using (Graphics g = Graphics.FromImage(bmp)) { 
    g.TranslateTransform(bmp.Width/2, bmp.Height/2); 
    g.RotateTransform(30); 
    SizeF textSize = g.MeasureString("hi", font); 
    g.DrawString("hi", font, Brushes.Red, -(textSize.Width/2), -(textSize.Height/2)); 
} 

Ich mag diese

enter image description here alle auf das Bild, den Text Tile müssen ziehen

ich weiß, dass ich die Koordinaten erhöhen können und verwenden Sie einen Loop.I haben

Bitmap bmp = new Bitmap(pictureBox1.Image); 
      for (int i = 0; i < bmp.Width; i += 20) 
      { 
       for (int y = 0; y < bmp.Height; y += 20) 
       { 
        using (Graphics g = Graphics.FromImage(bmp)) 
        { 
         g.TranslateTransform(bmp.Width/2, bmp.Height/2);      
         g.RotateTransform(30); 
         SizeF textSize = g.MeasureString("my test image", DefaultFont); 
         g.DrawString("my test image", DefaultFont, Brushes.Yellow, i, y); 

        } 
       } 
      } 
      pictureBox1.Image = bmp; 

Dadurch ergibt sich folgendes Ergebnis

enter image description here

Wie kann ich den Text richtig platzieren, indem Sie die gezogene Fläche von properly.May zu einem besseren und schnelleren Ansatz.

+0

fügen Sie den gleichen Text jedes Mal hinzu oder ist es überhaupt dynamisch? – Plutonix

Antwort

1

Rufen Sie eine zusätzliche TranslateTransform, um den Text dorthin zu verschieben, wo Sie es wollen, dann zeichnen Sie Text mit DrawString bei (0, 0) Koordinaten. Dadurch wird jeder Text um sein eigenes Zentrum gedreht, anstatt den Text um die Absatzmitte zu drehen.

Bitmap bmp = new Bitmap(pictureBox1.Image); 
Graphics g = Graphics.FromImage(bmp); 
String text = "TextTile"; 

Font font = new Font(DefaultFont.Name, 20); 
SizeF size = g.MeasureString(text, font); 
int textwidth = size.ToSize().Width; 
int textheight = size.ToSize().Height; 

int y_offset = (int)(textwidth * Math.Sin(45 * Math.PI/180.0)); 

//the sin of the angle may return zero or negative value, 
//it won't work with this formula 
if (y_offset >= 0) 
{ 
    for (int x = 0; x < bmp.Width; x += textwidth) 
    { 
     for (int y = 0; y < bmp.Height; y += y_offset) 
     { 
      //move to this position 
      g.TranslateTransform(x, y); 

      //draw text rotated around its center 
      g.TranslateTransform(textwidth, textheight); 
      g.RotateTransform(-45); 
      g.TranslateTransform(-textwidth, -textheight); 
      g.DrawString(text, font, Brushes.Yellow, 0, 0); 

      //reset 
      g.ResetTransform(); 
     } 
    } 
} 

pictureBox1.Image = bmp; 

Das obige Beispiel verwendet eine größere Schrift mit Größe 20. Sie können diese Funktion DefaultFont.size verwenden zurück. Es verwendet 45-Grad-Winkel.

+0

Vielen Dank, es funktioniert gut.Ich wunderte mich über die Leistung dieses Ansatzes, wenn das Bild von großer Größe ist. Zeichnet der Text über eine Bitmap und Zeichnen dieser Bitmap über das gesamte Bild ein besserer Ansatz? – techno

+0

Sie sollten automatisch doppelte Pufferung haben. Der obige Code sollte das Bild im Speicher vorbereiten und es nur einmal auf dem Bildschirm zeichnen. Der größte Engpass ist, wenn das Bild auf dem Bildschirm gezeichnet wird oder wenn Pixel auf dem Bildschirm geändert werden. Übrigens, die letzte Zeile ist nicht notwendig: 'pictureBox1.Image = bmp;' Alternativ können Sie das imagebox-Bild auf none setzen, dann das Bild zur Laufzeit laden und darauf zeichnen und schließlich 'pictureBox1.Image = setzen bmp; 'am Ende. –

+0

okay ... Danke ... :) – techno

1

Sie fügen den Text in der Mitte der Seite ein.
dies bedeutet, dass Ihr Bild 0,0 Koordinaten bei 50% sind 50% des anderen Bildes

, wenn Sie das gewünschte Ergebnis i Sie die Bildbreite würde vorschlagen gewünscht erhalten möchten in Blöcken von 25% devide zu erhalten die 16 Blöcke vorgeschlagen. Fügen Sie dann eines dieser Textbilder in die Mitte jedes dieser Blöcke ein.

erinnern Sie sich, wenn Sie ein Bild hinzufügen und Sie wollen das Bild von Punkt nicht von Punkt 0,0 drehen (das ist, was in Ihrem Fall passiert) der Herkunft müssen Sie explizit angeben, denke der Befehl ist rotateorigan oder etwas in dieser Zeile,

+0

Können Sie die Implementierung veröffentlichen? – techno