2016-07-29 3 views
3

я использую следующий код, чтобы нарисовать текст в центре изображения под угломЧерепица текст поверх изображения под углом

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)); 
} 

Мне нужно Tile текст по всему изображению, как этот

enter image description here

Я знаю, что я могу увеличивать координаты и использовать Loop.I имеют

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; 

Это приводит к следующему результату

enter image description here

Как я поместить текст правильно, измеряя нарисованную область properly.May быть лучше и быстрее подход.

+0

Вы добавляете один и тот же текст каждый раз или вообще не динамичны? – Plutonix

ответ

1

Позвоните, чтобы добавить текст TranslateTransform, чтобы переместить текст туда, куда вы хотите его, а затем нарисуйте текст с помощью DrawString по координатам (0, 0). Это повернет каждый текст вокруг своего центра, вместо того, чтобы вращать текст вокруг центра абзаца.

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; 

В приведенном выше примере используется более крупный шрифт с размером 20. Вы можете установить его обратно использовать DefaultFont.size. Он использует угол 45 градусов.

+0

Большое спасибо, он отлично работает. Мне было интересно узнать о производительности этого подхода, если изображение имеет большой размер. Рисует текст поверх растрового изображения и рисует, что растровое изображение на всем изображении лучше подходит? – techno

+0

Вы должны автоматически иметь двойную буферизацию. Над кодом следует подготовить изображение в памяти и нарисовать его на экране только один раз. Основным узким местом является то, когда изображение рисуется на экране или когда на экране меняются пиксели. Кстати, последняя строка не нужна: 'pictureBox1.Image = bmp;' В качестве альтернативы вы можете оставить изображение в виде изображения никем, затем загрузить изображение во время выполнения и нарисовать его, и, наконец, установить 'pictureBox1.Image = bmp; 'в конце. –

+0

ОК ... Спасибо ... :) – techno

1

Вы вставляете текст в центре страницы.
это означает, что изображение 0,0 координаты на 50%, 50% другого изображения

, если вы хотите, чтобы получить результат вы желаемого я хотел бы предложить вам разделите ширину изображения в блоках 25%, чтобы получить предложенные 16 блоков. затем добавив одно из этих текстовых изображений в центр каждого из этих блоков.

Помните, когда вы добавляете изображение и хотите, чтобы изображение вращалось с точки не от точки 0,0 (это то, что происходило в вашем случае), вам нужно указать его явно, считайте, что команда rotateorigan или что-то в этой строке,

+0

Не могли бы вы опубликовать реализацию? – techno

Смежные вопросы