在vs 2010 c#winForms中的运行时修改图像
本文关键字:运行时 修改 图像 vs 2010 c#winForms | 更新日期: 2023-09-27 18:24:58
我需要能够在运行时在png文件上绘制文本。(WinForm应用程序2010 c#)
应用程序启动,工具栏加载
检索到客户
此时,当加载客户时,必须修改工具栏上的图标,并在该图标的左下角添加一个数字或字母。(png文件)
我一直在玩一个noddy应用程序,只是想看看我能做些什么,但我没有什么问题。
- 如何获取png文件的路径。(我在考试中硬编码)
- 我可以画一个文本,但它不显示。我想我需要重新加载工具栏,不是吗
- 当第二次或更多次在图标上书写时,它会在我上一封信的顶部书写。我希望它删除/清除前一个,然后只使用新的
有什么建议吗?
我的临时代码:
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;
}
}
您可以在运行时执行此操作,而不必担心文件问题。如果您使用嵌入式资源,那么您就不必担心文件名、清除以前会话中的更改以及写入文件。默认情况下,创建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));
}
-
您可以使用文件/文件夹选择器来选择所需的文件或文件夹,也可以将其存储在配置文件或数据库中。以下是如何将其保存在app.config 中的示例
-
您应该使用图形对象的Flush方法来保存您的更改。像这样:
graphics.Flush();
-
在图片上使用图层(另一个相同大小的位图)你可以制作第三个通过在图片上渲染层并生成最终图像你可以随意去掉任何不必要的层次后来