在Resources(resx)中将图像添加到Base64编码的ImageStream

时间:2010-06-14 16:45:59

标签: c# .net resources

我正在处理一个较旧的项目,并对其进行更新。该程序的一部分有一个工具条,上面有许多按钮,每个按钮都有一个图像。我发现图像存储在表格的resx中的Base64编码图像流中,并按原样访问:

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
...
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
...
this.toolStrip1.ImageList = this.imageList1;
...
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
...
this.toolStripButton1.ImageIndex = 0;  //There are 41 images, so this can be between 0 and 40

我需要添加另一个带有新图像的按钮。如何将图像添加到此流?

我无法使用设计器,因为它在加载表单时崩溃(我相信因为它使用带有不安全代码的自定义组件)。

我总是可以添加一个与流分开的新图像资源,但这会使一个按钮不同,因此会产生一致性问题,导致以后出现维护问题。所以我想知道是否有任何方式让我编辑图像流。我可以访问原始base64字符串,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:5)

  • 创建另一个表单。
  • 添加ImageList组件。
  • 添加任意图像以生成“图像流”。
  • 打开旧的resx并复制“value”元素。
  • 打开新的resx和粘贴值元素。
  • 打开新表单。
  • 根据需要添加图片。
  • 保存新表单。
  • 打开新表单的resx文件。
  • 复制值元素。
  • 打开旧表单的resx文件。
  • 粘贴新值元素。

答案 1 :(得分:5)

我找到了一种使用代码执行此操作的方法:

imageList1.Images.Add( NEWIMAGE );
ResXResourceWriter writer = new ResXResourceWriter("newresource.resx");
writer.AddResource("imageList1.ImageStream",imageList1.ImageStream);
writer.Generate();
writer.Close();
writer.Dispose();

代码会将更新的ImageStream写入新资源文件。然后我可以将其复制到我当前的资源文件中。