再次将位图保存到MemoryStream时出错

时间:2019-02-01 21:31:57

标签: c#

我读过关于这个问题的其他线程,但很可惜我没有发现任何东西让我过去的这个错误:

A generic error occurred in GDI+

关于此错误的实例很多,但是没有一种解决方案对我有用。

我有以下代码 - 它缩放的图像,如果正确的参数被满足:

/// <summary>
/// Apply scaling (if enabled) to the given image 
/// </summary>
/// <param name="imageToScale">Scale image down by x.</param>
/// <param name="watchmanData">Watchman data containing settings.</param>
/// <returns>The original image, or a scaled down one.</returns>
public static Bitmap ApplyScaling(Bitmap imageToScale, Setting watchmanData)
{
    var returnData = imageToScale;

    if (watchmanData.ActuallyScaleDown)
    {
        using (var inStream = new MemoryStream())
        {
            imageToScale.Save(inStream, ImageFormat.Bmp);

            inStream.Position = 0;

            using (var outStream = new MemoryStream())
            {
                outStream.Position = 0;

                MagicImageProcessor.ProcessImage(inStream, outStream,
                    new ProcessImageSettings {Width = imageToScale.Width / watchmanData.ScaleBy});

                returnData = (Bitmap)Image.FromStream(outStream);

                outStream.Close();
            }

            inStream.Close();
        }
    }

    return returnData;
}

此代码工作在第一时间没有问题。然而对在该行第二个:

imageToScale.Save(inStream, ImageFormat.Bmp);

我得到了错误。

我已经设置了流位置为0,我已经关闭了流一旦处理完成,但我仍然得到这个错误。

我假设 using 将在流完成后摆脱它们。传入的图像甚至是另一个实例:

var window = new Image<Bgr, byte>(ImageOperations.ApplyScaling(WindowOperations.TakeScreenshot(focusWindow), watchmanSettings));
var split = new Image<Bgr, byte>(ImageOperations.ApplyScaling(lookFor, watchmanSettings));

(发送第二张图像时发生错误,在这种情况下,标记为“分割”)

我一定做错了事,因为代码在第一次出现时就起作用了,任何指导或要检查的东西都很棒,谢谢。

1 个答案:

答案 0 :(得分:1)

您从outStream制作了一个位图,而该位图是该位图的基础存储...因此您不想对其进行修改。而且,当您using是一种资源时,您不想/不需要自己关闭它。要澄清:

/// <summary>
/// Apply scaling (if enabled) to the given image 
/// </summary>
/// <param name="imageToScale">Scale image down by x.</param>
/// <param name="watchmanData">Watchman data containing settings.</param>
/// <returns>The original image, or a scaled down one.</returns>
public static Bitmap ApplyScaling(Bitmap imageToScale, Setting watchmanData)
{
    var returnData = imageToScale;

    if (watchmanData.ActuallyScaleDown)
    {
        using (var inStream = new MemoryStream())
        {
            imageToScale.Save(inStream, ImageFormat.Bmp);

            inStream.Position = 0;  //--> not sure you need this...maybe

            var outStream = new MemoryStream();

            MagicImageProcessor.ProcessImage(inStream, outStream,
                new ProcessImageSettings {
                   Width = imageToScale.Width / watchmanData.ScaleBy});

            returnData = (Bitmap)Image.FromStream(outStream);
        }
    }

    return returnData;
}

来自Image.FromStream Method-备注中的注释:

  

您必须在图像的生命周期内保持流打开。