gpt4 book ai didi

C# 图片 : Attempted to read or write protected memory

转载 作者:行者123 更新时间:2023-12-03 13:18:05 25 4
gpt4 key购买 nike

我正在编写将图片框屏幕保存为 JPEG 文件的 C# 应用程序。

一个线程创建图像:

IntPtr copyPtr = new IntPtr((void*)pArray);
image = new Bitmap(bitmapInfo.biWidth, Math.Abs(bitmapInfo.biHeight), bitmapInfo.biWidth * 3, PixelFormat.Format24bppRgb, copyPtr);
lock (image)
{
this.CreateGraphics().DrawImage(image, (window_width - (width * new_value)) / 2, (window_height - (height * new_value)) / 2, width * new_value, height * new_value);
}

和其他线程保存图片:
try
{
while ((t < (time * 60 * 1000)) && !done)
{
lock (image)
{
image.Save(folder + this.filename + DateTime.Now.ToString("yyyMMddHHmmssFFFFFFF") + ".jpg", ImageFormat.Jpeg);
}
t = t + interval;
System.Threading.Thread.Sleep(interval);
i++;
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
Console.WriteLine("Stack trace: " + e.StackTrace);
}

但有时我会得到这个异常(exception):
Exception: Attempted to read or write protected memory. This is often an indicat
ion that other memory is corrupt.
Stack trace: at System.Drawing.SafeNativeMethods.Gdip.GdipSaveImageToFile(Han
dleRef image, String filename, Guid& classId, HandleRef encoderParams)
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, Encoder
Parameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at MyDLL.Window.SaveJPEG(String filename, Int32 fps, Int32
time)

我使用了锁定调用,但它似乎不是很有帮助。我可以将图像保存在同一个线程中。但也许有任何解决方案如何在使用线程时解决这个问题。谢谢。

最佳答案

检查您的 image 的声明多变的。
您可能已将其定义为具有公共(public)访问权限。
通常最好在代码中定义一个私有(private)或本地对象,然后锁定,例如

Object imageLock = new Object();
IntPtr copyPtr = new IntPtr((void*)pArray);
image = new Bitmap(bitmapInfo.biWidth, Math.Abs(bitmapInfo.biHeight), bitmapInfo.biWidth * 3, PixelFormat.Format24bppRgb, copyPtr);
lock (imageLock)
{
this.CreateGraphics().DrawImage(image, (window_width - (width * new_value)) / 2, (window_height - (height * new_value)) / 2, width * new_value, height * new_value);
}

然后在您的其他线程代码中:
Object imageLock = new Object();
try
{
while ((t < (time * 60 * 1000)) && !done)
{
lock (imageLock)
{
image.Save(folder + this.filename + DateTime.Now.ToString("yyyMMddHHmmssFFFFFFF") + ".jpg", ImageFormat.Jpeg);
}
t = t + interval;
System.Threading.Thread.Sleep(interval);
i++;
}
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
Console.WriteLine("Stack trace: " + e.StackTrace);
}

关于C# 图片 : Attempted to read or write protected memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3500505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com