Avoid GetThumbnailImage - it will provide very unpredictable results, since it tries to use the embedded JPEG thumbnail if available - even if the embedded thumbnail is entirely the wrong size. DrawImage() is a much better solution.
Wrap your bitmap in a using{} clause - you don't want leaked handles floating around...
Also, you'll want to set your Jpeg encoding quality to 90, which is where GDI+ seems to shine the best:
System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
System.Drawing.Imaging.EncoderParameters encoderParameters;
encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90L);
thumb.Save(ms, info[1], encoderParameters);
I know that a large percentage of my customers buy my image resizing code to use for integration with image upload systems. Due to the good documentation, very few need help modifying the code. For those who do, I offer customization for a small fee.