I do this for video (a little thread I did a few months back:
http://gbatemp.net/index.php?showtopic=739...t=0&start=0 ) rather than still images (they bore me for some reason) but the principle is the same (although video has the luxury of several hundred near identical images you can use to fix errors which is a bit of a double edged sword as quality does not necessarily have to be as high when there are 20 odd frames per second). The maths behind all this gets horrific (it takes matrices about 60 levels further).
Avisynth (a scripting language that forms one of the most power editors going) has image processing capabilities too (see the producing/source filter " ImageReader / ImageSource ") and has a hell of a lot of very high end/experimental grade filters (normally quite slow but when it is but a single image it does not matter so much).
Everyone so far has said what I would have (half decent chemical/film photos have an effective resolution far higher than most digital cameras this side of "how much???") but still you sometimes have to blow up small images.
Digital images are almost always pixel based (I am ignoring vector based images and wave compression right now) and part of that is a good deal of the time the pixel adjacent to another is going to be very similar to it. This means you can guess what a pixel would have been if the resolution was higher. Enter numerous algorithms to do the deed.
The simplest (in general use anyhow) is nearest neighbour (called PointResize in avisynth) and is very rarely used for upscaling by itself if quality is your aim (examination, quick and (very) dirty and "special effects" only).
After this Avisynth has BicubicResize, BilinearResize, GaussResize, LanczosResize, Lanczos4Resize, Spline16Resize, Spline36Resize. For serious upscaling (up to around double size) Lanczos works for me.
More advanced ones can be found here:
http://forum.doom9.org/forumdisplay.php?s=...mp;daysprune=-1
One to look at:
http://forum.doom9.org/showthread.php?t=129953
For some really nice tests (albeit slightly outdated now):
http://www.general-cathexis.com/interpolation/index.html
Sidenote the principle behind mipsmooth (a fairly nice filter for noise reduction) is that of mip map, it works by assuming noise is small and will disappear when the image is shrunk and then not be there when it is blown back up. Knowing this you do not need to find a filter for your app of choice.
Secondly deinterlacing filters (especially of the bob variety) are quite useful as resize tools and more than that the inpainting algorithms are even better so as was hinted at with the "use sharpen afterwards" posts above you can chain filters to improve the result.