diff --git a/src/System.Windows.Forms.Design/src/System/Drawing/Design/ImageEditor.cs b/src/System.Windows.Forms.Design/src/System/Drawing/Design/ImageEditor.cs index 4bcb8cca757..27c064fa0eb 100644 --- a/src/System.Windows.Forms.Design/src/System/Drawing/Design/ImageEditor.cs +++ b/src/System.Windows.Forms.Design/src/System/Drawing/Design/ImageEditor.cs @@ -171,11 +171,10 @@ protected virtual Image LoadFromStream(Stream stream) } // Copy the original stream to a new memory stream to avoid locking the file. - using (var memoryStream = new MemoryStream()) - { - stream.CopyTo(memoryStream); - return Image.FromStream(memoryStream); - } + // The created image will take over ownership of the stream. + var memoryStream = new MemoryStream(); + stream.CopyTo(memoryStream); + return Image.FromStream(memoryStream); } /// diff --git a/src/System.Windows.Forms.Design/src/System/Windows/Forms/Design/ImageListImageEditor.cs b/src/System.Windows.Forms.Design/src/System/Windows/Forms/Design/ImageListImageEditor.cs index 818e4d7303f..64cd834c816 100644 --- a/src/System.Windows.Forms.Design/src/System/Windows/Forms/Design/ImageListImageEditor.cs +++ b/src/System.Windows.Forms.Design/src/System/Windows/Forms/Design/ImageListImageEditor.cs @@ -105,10 +105,9 @@ private ImageListImage LoadImageFromStream(Stream stream, bool imageIsIcon) byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, (int)stream.Length); - using (MemoryStream ms = new MemoryStream(buffer)) - { - return ImageListImage.ImageListImageFromStream(ms, imageIsIcon); - } + // The created image will take over ownership of the stream. + MemoryStream ms = new MemoryStream(buffer); + return ImageListImage.ImageListImageFromStream(ms, imageIsIcon); } /// diff --git a/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/BitmapEditorTests.cs b/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/BitmapEditorTests.cs index 4400b17f7a3..e00db88b1c9 100644 --- a/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/BitmapEditorTests.cs +++ b/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/BitmapEditorTests.cs @@ -84,6 +84,10 @@ public void BitmapEditor_LoadFromStream_BitmapStream_ReturnsExpected() stream.Position = 0; Bitmap result = Assert.IsType(editor.LoadFromStream(stream)); Assert.Equal(new Size(10, 10), result.Size); + + using var resultStream = new MemoryStream(); + result.Save(resultStream, ImageFormat.Bmp); + Assert.Equal(stream.Length, resultStream.Length); } } diff --git a/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/ImageEditorTests.cs b/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/ImageEditorTests.cs index 1b5b27ef27b..92065865662 100644 --- a/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/ImageEditorTests.cs +++ b/src/System.Windows.Forms.Design/tests/UnitTests/System/Drawing/Design/ImageEditorTests.cs @@ -141,6 +141,10 @@ public void ImageEditor_LoadFromStream_BitmapStream_ReturnsExpected() stream.Position = 0; Bitmap result = Assert.IsType(editor.LoadFromStream(stream)); Assert.Equal(new Size(10, 10), result.Size); + + using var resultStream = new MemoryStream(); + result.Save(resultStream, ImageFormat.Bmp); + Assert.Equal(stream.Length, resultStream.Length); } } diff --git a/src/System.Windows.Forms.Design/tests/UnitTests/System/Windows/Forms/Design/ImageListImageEditorTests.cs b/src/System.Windows.Forms.Design/tests/UnitTests/System/Windows/Forms/Design/ImageListImageEditorTests.cs new file mode 100644 index 00000000000..cd962435b8f --- /dev/null +++ b/src/System.Windows.Forms.Design/tests/UnitTests/System/Windows/Forms/Design/ImageListImageEditorTests.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using Xunit; + +namespace System.Windows.Forms.Design.Tests +{ + public class ImageListImageEditorTests : IClassFixture + { + [Fact] + public void ImageListImageEditor_LoadImageFromStream_BitmapStream_ReturnsExpected() + { + var editor = new ImageListImageEditor(); + var editor_LoadImageFromStream = editor.TestAccessor().CreateDelegate>("LoadImageFromStream"); + + using var stream = new MemoryStream(); + using var image = new Bitmap(10, 10); + image.Save(stream, ImageFormat.Bmp); + stream.Position = 0; + + var result = Assert.IsType(editor_LoadImageFromStream(stream, false)); + var resultImage = Assert.IsType(result.Image); + Assert.Equal(new Size(10, 10), result.Size); + Assert.Equal(new Size(10, 10), resultImage.Size); + + using var resultStream = new MemoryStream(); + result.Image.Save(resultStream, ImageFormat.Bmp); + Assert.Equal(stream.Length, resultStream.Length); + } + } +}