我想运行这段代码
Bitmap grayImage = (Bitmap)img.Clone();
for (int x = 0; x < arr.GetLength(0); x++)
{
for (int y = 0; y < arr.GetLength(1); y++)
{
int col = arr[x, y];
Color grau = Color.FromArgb(col, col, col);
grayImage.SetPixel(x, y, grau);
}
}
如果我运行代码,我会在此行中获得异常:grayImage.SetPixel(x,y,grau);
以下是例外详情:
System.Runtime.InteropServices.ExternalException wurde nicht behandelt。 Message =“GDI +中发生了一般错误。” 来源= “System.Drawing中” 错误码= -2147467259 堆栈跟踪: 在System.Drawing.Bitmap.SetPixel(Int32 x,Int32 y,Color color) 在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Bild.cs中的Metalldetektor.Bild.ArrToPic(Int32 [,] arr,Image img):第44行 at Metalldetektor.Form1.button2_Click(Object sender,EventArgs e)在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs:第58行 在System.Windows.Forms.Control.OnClick(EventArgs e) 在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 在System.Windows.Forms.Control.WmMouseUp(消息&amp; m,MouseButtons按钮,Int32点击) 在System.Windows.Forms.Control.WndProc(消息&amp; m) 在System.Windows.Forms.ButtonBase.WndProc(消息&amp; m) 在System.Windows.Forms.Button.WndProc(消息&amp; m) 在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m) 在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam) 在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg) 在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID,Int32 reason,Int32 pvLoopData) 在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context) 在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext context) 在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Program.cs中的Metalldetektor.Program.Main():第19行 在System.AppDomain._nExecuteAssembly(Assembly assembly,String [] args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart() InnerException:
我不知道该怎么做,请帮忙!
答案 0 :(得分:2)
我过去遇到过类似的问题,我的克隆位图有一些文物。在研究了这个问题一段时间之后,我偶然发现this thread帮了解。
尝试更换克隆()
Bitmap grayImage = (Bitmap)img.Clone();
用这个:
Bitmap grayImage = new Bitmap(img);
答案 1 :(得分:0)
我不知道这个错误,但这可能是LockBits的情况......我会看看我是否可以举一个例子。
这是一个将数据数组写入ARGB位图的简化示例:
// fake data
int[,] data = new int[100, 150];
int width = data.GetLength(0), height= data.GetLength(1);
for (int x = 0; x < width; x++)
for (int y = 0; y < height; y++)
data[x, y] = x + y;
// process it into a Bitmap
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe {
byte* root = (byte*)bd.Scan0;
for (int y = 0; y < height; y++) {
byte* pixel = root;
for (int x = 0; x < width; x++) {
byte col = (byte)data[x, y];
pixel[0] = col;
pixel[1] = col;
pixel[2] = col;
pixel[3] = 255;
pixel += 4;
}
root += bd.Stride;
}
}
bmp.UnlockBits(bd);
bmp.Save("foo.bmp"); // or show on screen, etc
这种方法应该比SetPixel
快批次。
答案 2 :(得分:0)
很久以前,在我的一个队友系统上处理图像(通过从SQL服务器读取二进制数据创建图像)时出现了一些错误。相同的代码在其他机器上运行良好。事实证明,他已经为图形驱动程序安装了一些更新,这导致了问题。
答案 3 :(得分:0)
如果您只是覆盖所有图像(或左上角的矩形),为什么要克隆另一个图像?