The example with get and setPixel is actually a very bad example, first off there is a lot of overhead in the Get- and SetPixel methods causing an issue with respect to performance.
Second, it is better to have the loops inverted:
for(int y=0;y<image.Height;y++)
for(int x=0;x<image.Width;x++)
This has to do with the memory, when you retrieve something from the memory you usually end up getting a chunk of memory, since this chunk is linear and the pixels are stored in the memory much the same way that you'd visualize the image (left to right from the top), the chunk you're getting is likely not to contain the next pixel if you iterate to the next Y pixel in the inner loop, causing you to lose a bit more time because the next pixel always has to be retrieved from the slower memory.
If you want to do something similar to this code have a look at the LockBits and UnlockBits functions, iterating over the Scan0 pointer is a lot more efficient then this code. Though the example for the lockbits and unlockbits functions is also not very good as it copies all the data into an array first, making it easier to manage but again a bit slower because the example does two copy operations while this is completely unneeded if you just use the pointer.
If you're not comfortable using pointers you can always get one of the various classes floating around the internet that expose easy to use functions similar to the one above but with an implementation that uses lock- and unlockbits