在vs 2010 c#winForms中运行时修改图像

时间:2012-02-18 11:34:36

标签: c# winforms system.drawing

我需要能够在运行时在png文件上绘制文本。(WinForm app 2010 c#)

已启动应用程序启动和工具栏

检索客户

此时加载客户时,必须修改工具栏上的图标,并在此图标的左下角添加数字或字母。(png文件)

为了看看我能做些什么,我一直在玩一个低劣的应用程序,但我几乎没有问题。

  1. 如何获取png文件的路径。(我在测试中对其进行了硬编码)
  2. 我能够绘制文字但是没有显示。我想我需要重新加载工具栏,不是吗?
  3. 当第二次或更多时间在图标上书写时,它会写在我之前的一封信之上。我希望它删除/清除之前的一封信,然后再刷新一封。
  4. 有什么建议吗?

    我的临时代码:

     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 :(得分:0)

  1. 您可以使用文件/文件夹选择器选择所需文件或 文件夹或您可以将其存储在配置文件或数据库中。Here是如何将其保存在app.config中的示例

  2. 您应该使用图形对象的Flush方法来保存您的 变化。就像这样:

    graphics.Flush();

  3. 在图片上使用图层(另一个相同尺寸的位图) 而不是改变图像本身,然后你可以做出第三个 图片通过渲染图层并生成最终图像但是 你有摆脱任何不必要的层的自由 后面。

答案 1 :(得分:0)

您可以在运行时执行此操作,而无需担心文件。如果使用嵌入式资源,则无需担心文件名并清除以前会话中的更改并写入文件。默认情况下,当您创建“工具栏”按钮时,它将使用嵌入式资源(如果在项目中使用resx文件,则可以引用其他表单使用的共享资源)。但是一旦你有了这个,你甚至不需要像你一样克隆图像(制作一个新的Bitmap)。这里有一些更简单的示例代码,可以就地更新图像:

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