C# 以编程方式更改窗体墙纸的不同方式

C# 以编程方式更改窗体墙纸的不同方式,c#,winforms,wallpaper,C#,Winforms,Wallpaper,我需要通过用户选择的jpg文件以编程方式分配窗体的墙纸。 我用新的位图做了这个,但如果我这样做,jpeg文件将变成只读 是否可以加载到RAM jpeg文件并将其用作壁纸?还是将jpeg文件添加到项目资源并使用资源 对不起,我的英语很差:( 致以最诚挚的问候。使用记忆流: MemoryStream ms = new MemoryStream(File.ReadAllBytes(pathToImageFile)); this.BackgroundImage = Image.FromStream(ms

我需要通过用户选择的jpg文件以编程方式分配窗体的墙纸。 我用新的位图做了这个,但如果我这样做,jpeg文件将变成只读

是否可以加载到RAM jpeg文件并将其用作壁纸?还是将jpeg文件添加到项目资源并使用资源

对不起,我的英语很差:(


致以最诚挚的问候。

使用
记忆流

MemoryStream ms = new MemoryStream(File.ReadAllBytes(pathToImageFile));
this.BackgroundImage = Image.FromStream(ms); ;

避免GDI+对文件设置文件锁定的最简单方法是使用位图(图像)构造函数制作位图的深度副本。如下所示:

    private void SetWallpaperButton_Click(object sender, EventArgs e) {
        if (openFileDialog1.ShowDialog() == DialogResult.OK) {
            using (var img = Image.FromFile(openFileDialog1.FileName)) {
                if (this.BackgroundImage != null) this.BackgroundImage.Dispose();
                this.BackgroundImage = new Bitmap(img);
            }
        }
    }

using语句确保释放文件锁调用可确保旧位图快速销毁,这一点很重要,因为在32位操作系统上,使用大型位图时,经常会避开OOM。

此方法与以前的方法不同?有两个大方法。首先,保证位图与视频适配器的像素格式兼容,因此它将快速渲染。其次,它更易于使用更易于处置非托管资源。当您使用MemoryStream时,您必须保留它,直到位图不再使用为止。