How it Works
Image Cipher embeds textual data in an image by pseudorandomly selecting a handful of points and performing minor color transformations on those pixels. The naive approach to this would be to simply increment the value of a pixel (encoded as an integer) by the ordinal value of a character, but with this approach the user would need to supply the original image as well as the transformed image in order to decipher a message. To avoid this inconvenience, I decided to treat every other pixel as a reference value for the pixel preceding it. Instead of comparing a pixel in the transformed image to the same pixel in the original, my code compares a pixel in the transformed image to an adjacent pixel in the transformed image. The effect is inconspicuous, as adjacent pixels usually have similar color values anyway.
I took some additional measures to make the color transformations more transparent. Instead of simply adding the ordinal value of a character to the color value of a pixel, my code adds the ordinal difference between that character and the letter "e" — this makes the transformations very subtle since messages are typically comprised of a few uppercase letters and many lowercase letters. I also distribute the difference over the red, green and blue components of a color value instead of merely adding it to their combination (typically r*216+g*28+b), which would have levied too much of the weight on the blue component. There is still some room for improvement, but as long as the image is not tiny and the message is not too lengthy, the effects should generally not be noticeable.
Note that the technique used is not very cryptographically secure. I employed PHP's mt_rand() function for pseudorandom point selection, which has rather poor granularity. It is conceivable that a skilled programmer could decipher a message (albeit with considerable effort), especially if the message is large and the image is small. The security could be improved by applying an additional block cipher to the message before embedding it, but most such ciphers would magnify the image distortions by expanding the range of characters used (the current code is optimized for messages consisting mostly of A-z letters), so I'm reluctant to do so.

