>>1242301If I were to have hidden text inside a photo, the way I would do it is to treat the image as a pixel array, each pixel being a three-tuple of RGB, turn my text into a bitstream, and overwrite the least significant 'n' bits of each pixel color in row major order, using bits from the stream. This has the advantage of not having any extra size added to the image, and holds a surprisingly large amount of data.
e.g. - Here's a 2x2 image of a b/w 'checkerboard', with string '4chwsr', with offset 4
For reference, 'wsr' = [0x34 0x63 0x68 0x77 0x73 0x72] = [00110100 01100011 01101000 01110111 01110011 01110010]
Before insertion:
[00000000 00000000 00000000] [11111111 11111111 11111111]
[11111111 11111111 11111111] [00000000 00000000 00000000]
After insertion:
[0000{0011} 0000{0100} 0000{0110}] [1111{0011} 1111{0110} 1111{1000}]
[1111{0111} 1111{0111} 1111{0111}] [0000{0011} 0000{0111} 0000{0010}]
Extracting is similarly easy. Of course, some basic knowledge of bitwise ops is required, but nothing more than that. Were you to implement this, I would recommend python's imageio imread and imwrite, for ease of use. Of course, you mention a collection of images, so you probably want to pull a list of the, say, 1000 most common english words, and throw it against whatever you extract from offsets 1->8, if you get a nontrivial number of matches, congrats, you've found your text. If not, no problem, you've made a nice tool for yourself which will follow you in your travels)
Of course, this is not the only stego scheme which can be done. For example, a sender with a small message and a big file, could instead overwrite say - every 69th pixel - fully to whatever byte corresponds with the character in their message. If they are being more complex, this (or LSB steg) could be done in column-major order, or reverse order, or diagonal...etc. Finally, ASCII is 7 bits, so MSB could be random. Consider 01110111 ~ 'w', 11110111 ~ '÷'. Addendum, check EXIF tags.