class.upload.php is a powerful and mature PHP class to manage uploaded files, and manipulate images in many ways. The script is available under a GPL license.
You can set image_x and image_y at the same time, using image_ratio. The image will then be resized to fit within the two dimensions, maintaining aspect ratio and orientation.
Note that you can also use image_ratio_crop instead of image_ratio. That would then make the image to be exactly 400x400, maintaining aspect ratio, and discarding excess image. Try it to see what it does. You can also try image_ratio_fill, which is more similar to image_ratio.Reply
For instance:
will resize your images so that they fit within 400x400:
See this thread or this other one which describes a more advanced method.
Note that you can also use image_ratio_crop instead of image_ratio. That would then make the image to be exactly 400x400, maintaining aspect ratio, and discarding excess image. Try it to see what it does. You can also try image_ratio_fill, which is more similar to image_ratio.