Так влияют, что вы пишете/читаете напрямую в ту память, которая будет потом использовать Bitmap-ом для отрисовки/сохранения и всего прочего. В частности, у вас нет вызовов GetPixel/SetPixel, которые ОЧЕНЬ МЕДЛЕННЫЕ для данной задачи. У вас цикл по двум измерениям картинки, т.е. вызовов GetPixel будет width * height штук. Поверьте, это много и тяжело. Адресная арифметика, а именно
curpos = ((byte*)bd.Scan0) + h * bd.Stride;
намного легче. Собственно, возможность ее применения обеспечивается блокировкой реальных данных битмапа методом LockBits. Под блокировкой здесь понимается пометка для кода CLR, в частности для GC, что этот участок памяти трогать нельзя (перемещать, например), пока вы эту пометку не снимете.
Собственно говоря, более-менее быстрая работа с Bitmap возможна только через BitmapData, так как используя Get/SetPixel вы не дождетесь конца работы вашего алгоритма.