我在调试代码时遇到了System.IndexOutOfRangeException错误。有人能帮我解决这个问题吗?请查看图片中异常发生的位置。程序成功读取了“Line Array”的第一行,但在读取第二行时发生了异常。当i=1且j=0时发生异常。
以下是代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Drawing;using System.Drawing.Imaging;namespace Handwriting.SVMs{ static class Features { /// <summary> /// 从包含二进制0和1的图像表示的文本中提取图像。 /// </summary> /// public static Bitmap Extract(string text) { Bitmap bitmap = new Bitmap(32, 32, PixelFormat.Format32bppRgb); string[] lines = text.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < 32; i++) { for (int j = 0; j < 32; j++) { if (lines[i][j] == '0') bitmap.SetPixel(j, i, Color.White); else bitmap.SetPixel(j, i, Color.Black); } } return bitmap; } /// <summary> /// 从图像中提取特征向量表示,将二进制图像“平展”成0和1的数组。 /// </summary> /// public static double[] Extract(Bitmap bmp) { double[] features = new double[32 * 32]; for (int i = 0; i < 32; i++) for (int j = 0; j < 32; j++) features[i * 32 + j] = (bmp.GetPixel(j, i).R == 255) ? 0 : 1; return features; } /// <summary> /// 将包含0和1的特征向量转换回图像,每个像素在图像中表示。 /// </summary> /// public static Bitmap Export(double[] features) { Bitmap bitmap = new Bitmap(32, 32, PixelFormat.Format32bppRgb); for (int i = 0; i < 32; i++) for (int j = 0; j < 32; j++) { double v = features[i * 32 + j]; v = 255 - Math.Max(0, Math.Min(255, Math.Abs(v) * 255)); bitmap.SetPixel(j, i, Color.FromArgb((int)v, (int)v, (int)v)); } return bitmap; } public static double[] Preprocess(Bitmap bitmap) { double[] features = new double[64]; for (int m = 0; m < 8; m++) { for (int n = 0; n < 8; n++) { int c = m * 8 + n; for (int i = m * 4; i < m * 4 + 4; i++) { for (int j = n * 4; j < n * 4 + 4; j++) { Color pixel = bitmap.GetPixel(j, i); if (pixel.R == 0x00) // 白色 features[c] += 1; } } } } return features; } }}
回答:
尝试替换
string[] lines = text.Split(new String[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
为
string[] lines = text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
另外,您必须确保text
包含至少32行非空行,每行有32个字符。如果更改Split
方法无效,那么问题可能出在text
变量上。
从您的描述来看,似乎没有lines[1];
所有行都被放置在lines[0];
中 – 您可以在第二张图片中看到这一点