0
好的,我創建了兩個程序。一個使用GetPixels
,另一個使用LockBits
。我的getPixels方案如下......BitLock-GetPixels。時間和PixelFormat
所指的條紋圖像爲200x200的JPG
Stopwatch GetTime = new Stopwatch();
Bitmap img = new Bitmap("stripe.jpg");
GetTime.Start();
for (int i = 0; i < img.Width; i++)
{
for (int j = 0; j < img.Height; j++)
{
Color pixel = img.GetPixel(i, j);
output += " " + pixel;
}
}
GetTime.Stop();
現在這一個讀出約20秒來處理此圖像輸出的所有像素。太棒了,但是我的LockBits理論上應該更快。我的LockBits的代碼是...
Bitmap bmp = new Bitmap("stripe.jpg");
Rectangle bmpRec = new Rectangle(0, 0, bmp.Width, bmp.Height); //Creates Rectangle for holding picture
BitmapData bmpData = bmp.LockBits(bmpRec, ImageLockMode.ReadWrite, Pixels); //Gets the Bitmap data
IntPtr Pointer = bmpData.Scan0; //Scans the first line of data
int DataBytes = Math.Abs(bmpData.Stride) * bmp.Height; //Gets array size
byte[] rgbValues = new byte[DataBytes]; //Creates array
string Pix = " ";
Marshal.Copy(Pointer, rgbValues, 0, DataBytes); //Copies of out memory
bmp.UnlockBits(bmpData);
Stopwatch Timer = new Stopwatch();
pictureBox1.Image = bmp;
Timer.Start();
for (int p = 0; p < DataBytes; p++)
{
Pix += " " + rgbValues[p];
}
Timer.Stop();
並且在那段時間是37secs。現在我不明白爲什麼我的時間比Lockbits長,而不是GetPixels。
此外,我的輸出文件不匹配它們在哪裏列出。這幾乎就像他們沒有秩序。
這是一個很大的問題需要解決,所以提前感謝大家閱讀並試圖解決我的問題。
所有你在這裏計時的是字符串連接。我懷疑你的鎖定時間會更長,因爲你的圖像的寬度比寬度要長,而且你只是寫了更多的數據給字符串。要麼是這個,要麼是你正在測試的人爲因素。 – Blorgbeard
而你的第一個代碼是以不同的順序寫入數據到第二個。首先是從上到下寫,然後從左到右 - 其次是從左到右,然後從上到下寫。 – Blorgbeard