我需要能够在运行时在png文件上绘制文本。(WinForm app 2010 c#)
已启动应用程序启动和工具栏
检索客户
此时加载客户时,必须修改工具栏上的图标,并在此图标的左下角添加数字或字母。(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;
}
}
答案 0 :(得分:0)
您可以使用文件/文件夹选择器选择所需文件或 文件夹或您可以将其存储在配置文件或数据库中。Here是如何将其保存在app.config中的示例
您应该使用图形对象的Flush方法来保存您的 变化。就像这样:
graphics.Flush();
在图片上使用图层(另一个相同尺寸的位图) 而不是改变图像本身,然后你可以做出第三个 图片通过渲染图层并生成最终图像但是 你有摆脱任何不必要的层的自由 后面。
答案 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));
}