2 回答
TA贡献1820条经验 获得超3个赞
花了几天时间,但我想出了一个解决方案!
我将所有图像移动到同一解决方案中的另一个 C# 项目中,设置为编译为名为 DynamicResources.dll 的类库 DLL 文件(项目设置中的程序集名称为“DynamicResources”)。添加此项目作为对主项目的引用。因此,我可以访问 XAML 中的图像 - 干净整洁:
<Image Source="/DynamicResources;component/pics/image1.png" />
然后在主项目的构建后事件中,我重命名已编译的 .dll,这样它就不会在启动时被主 .exe 二进制文件加载:
copy "$(TargetDir)DynamicResources.dll" "$(TargetDir)DynamicResources.temp"
del "$(TargetDir)DynamicResources.dll"
然后我使用了一个名为 Mono.Cecil 的第三方库来加载 DynamicResources.temp 文件(DLL 格式),替换资源,将其写回内存,然后告诉应用程序加载它:
public static void UpdateAssembly()
{
string dllFile = "DynamicResources.temp";
string dllNamespace = "DynamicResources";
var asm = AssemblyDefinition.ReadAssembly(dllFile);
var module = asm.Modules.FirstOrDefault();
var resources = module.Resources;
var dllResource = (EmbeddedResource)(resources.FirstOrDefault());
var dllResourceReader = new ResourceReader(dllResource.GetResourceStream());
var newResourceOutputStream = new MemoryStream();
var newResourceWriter = new ResourceWriter(newResourceOutputStream);
foreach (DictionaryEntry dllResourceEntry in dllResourceReader)
{
var image = (BitmapSource)new ImageSourceConverter().ConvertFrom(dllResourceEntry.Value);
Color foreground = (Color)ColorConverter.ConvertFromString("#FFFFFF");
var processed = (WriteableBitmap)ColorizeImage(image, foreground); // Your image processing function ?
newResourceWriter.AddResource(dllResourceEntry.Key.ToString(), BitmapToByte(processed));
}
newResourceWriter.Close();
var newResource = new EmbeddedResource(dllResource.Name, dllResource.Attributes, newResourceOutputStream.ToArray());
module.Resources.Remove(dllResource);
module.Resources.Add(newResource);
var woutput = new MemoryStream();
asm.Write(woutput);
var doutput = woutput.ToArray();
Assembly assembly = Assembly.Load(doutput);
}
public static MemoryStream BitmapToByte(BitmapSource bitmapSource)
{
var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
var frame = System.Windows.Media.Imaging.BitmapFrame.Create(bitmapSource);
encoder.Frames.Add(frame);
var stream = new MemoryStream();
encoder.Save(stream);
return stream;
}
public static void AttachAssembly(string myAsmFileName)
{
Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + myAsmFileName); // LoadFrom
AppDomain.CurrentDomain.Load(assembly.GetName());
}
重要提示:在遍历资源时,它们会变为小写,因此您必须使用小写的文件和文件夹名称。
TA贡献1845条经验 获得超8个赞
您是否尝试过创建一个Bitmap然后将其设置为图像source?我认为这应该很容易。给你的图像一个名字,比如说theImage。你不可能不给它一个名字就引用这个图像。尝试以下操作:
string path="/Pics/Image3.png";//path to the image
var bitmapImage=new Bitmap(new Uri(path));
theImage.source=bitmapImage;//set the bitmap as the source.
不过,还有其他方法可以实现这一目标。希望这可以帮助?
- 2 回答
- 0 关注
- 196 浏览
添加回答
举报
