我读过关于这个问题的其他线程,但很可惜我没有发现任何东西让我过去的这个错误:
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));
(发送第二张图像时发生错误,在这种情况下,标记为“分割”)
我一定做错了事,因为代码在第一次出现时就起作用了,任何指导或要检查的东西都很棒,谢谢。
答案 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-备注中的注释:
您必须在图像的生命周期内保持流打开。