Изменить изображение во время выполнения в vs 2010 c # winForms - PullRequest
0 голосов
/ 18 февраля 2012

Мне нужно иметь возможность рисовать текст в png-файле во время выполнения. (WinForm app 2010 c #)

Приложение запускается и панель инструментов загружена

Клиент найден

В этот момент, когда клиент загружен, значок на панели инструментов должен быть изменен и добавлен либо цифра, либо буква в левом нижнем углу этого значка. (Png файл)

Я играл с приложением, чтобы посмотреть, что я могу сделать, но у меня мало проблем.

  1. Как мне получить путь к моему png-файлу (я жестко его кодирую в своем тесте)
  2. Я могу нарисовать текст, но он не отображается. Думаю, мне нужно перезагрузить панель инструментов, нет?
  3. Когда пишешь на иконку 2 раза или больше, пиши поверх моего предыдущего письма. Я хочу удалить / очистить предыдущее и просто получить новое.

Есть предложения?

Мой временный код:

 private void button1_Click(object sender, EventArgs e)
    {

        string filename = @"c:\WinFormTest\Resources\column.png";

        var bitmapImage = new Bitmap(Properties.Resources.column);
        bitmapImage.DrawText("A", new Font("Arial", 8), Brushes.Black, new RectangleF(0, 0, 500, 500), filename);

    }
}

public static class ImageExtensions
{
    public static Bitmap DrawText(this Bitmap image,string textToDraw,Font font,Brush brush,RectangleF rectangleF,string filename="")
    {
        if(image==null) throw new ArgumentNullException();
        if(font==null)throw new ArgumentNullException();
        if (brush == null) throw new ArgumentNullException();
        if (rectangleF == null) throw new ArgumentNullException();

        var format = filename.GetImageFormat();
        var newBitmap = new Bitmap(image, image.Width, image.Height);
        using (var graphics = Graphics.FromImage(newBitmap))
        {
            graphics.DrawString(textToDraw, font, brush, rectangleF);
        }
        if (!string.IsNullOrEmpty(filename))
        {newBitmap.Save(filename, format);}
        return newBitmap;
    }
    public static ImageFormat GetImageFormat(this string fileName)
    {
        if (string.IsNullOrEmpty(fileName))
            return ImageFormat.Bmp;
        if (fileName.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || fileName.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase))
            return ImageFormat.Jpeg;
        if (fileName.EndsWith("png", StringComparison.InvariantCultureIgnoreCase))
            return ImageFormat.Png;
        if (fileName.EndsWith("tiff", StringComparison.InvariantCultureIgnoreCase))
            return ImageFormat.Tiff;
        if (fileName.EndsWith("ico", StringComparison.InvariantCultureIgnoreCase))
            return ImageFormat.Icon;
        if (fileName.EndsWith("gif", StringComparison.InvariantCultureIgnoreCase))
            return ImageFormat.Gif;
        return ImageFormat.Bmp;
    }


}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2012

Вы можете сделать это во время выполнения, не беспокоясь о файлах. Если вы используете встроенные ресурсы, вам не нужно беспокоиться об именах файлов и об очистке изменений от предыдущих сессий и записи в файлы. Когда вы создаете кнопку Toolstrip по умолчанию, она будет использовать встроенный ресурс (и вы можете ссылаться на общий ресурс, который используется другими формами, если вы используете файл resx в вашем проекте). Но если у вас есть это, вам даже не нужно клонировать изображение (сделать новый растр), как вы это делаете. Вот несколько более простых примеров кода, которые обновят изображение на месте:

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();
      ((Bitmap)toolStripButton1.Image).DrawText("B", Font, SystemBrushes.ControlText,
         new RectangleF(new PointF(0, 0), toolStripButton1.Image.Size));
   }
}

public static class ImageExtensions
{
   public static void DrawText(this Bitmap image, string stringToDraw, Font font,
      Brush brush, RectangleF rectangleF)
   {
      using (Graphics g = Graphics.FromImage(image))
      {
         g.DrawString(stringToDraw, font, brush, rectangleF);
      }
   }
}

Поскольку изображение не сохраняется в файл, оно автоматически сбрасывается при каждом запуске программы. Это то, что ты хочешь, верно?

Если вам нужно сбросить изображение во время работы программы, вы можете скопировать сгенерированный код, который устанавливает изображение, в InitializeComponent. Например:

  private void toolStripButton1_Click(object sender, EventArgs e)
  {
     this.toolStripButton1.Image.Dispose();
     System.ComponentModel.ComponentResourceManager resources =
        new System.ComponentModel.ComponentResourceManager(typeof(Form1));
     this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));
     ((Bitmap)toolStripButton1.Image).DrawText("C", Font, SystemBrushes.ControlText,
        new RectangleF(new PointF(0, 0), toolStripButton1.Image.Size));
  }
0 голосов
/ 18 февраля 2012
  1. Вы можете использовать селектор файлов / папок, чтобы выбрать нужный файл или папку, или вы можете сохранить его в файле конфигурации или базе данных. Здесь - пример того, как сохранитьэто в app.config

  2. Вы должны использовать метод Flush для графического объекта, чтобы сохранить ваши изменения. Вот как:

    graphics.Flush ();

  3. Используйте слой поверх вашего изображения (еще одно растровое изображение того же размера) вместо того, чтобы изменять само изображение, тогда вы можете создать третье изображение, рендеринг слоев над ним и получить окончательное изображение, но у вас естьсвобода избавиться от любого ненужного слоя позже.

...