В общем случае конечно в протоколе передачи данных должен быть способ указания на то, как передаваемые данные интерпретировать. Например, в HTTP используются заголовки в ответе для указания типа содержимого (Content-Type) и кодирования на уровне HTTP, например, сжатия, если таковое присутствует. При получении данных клиент (например, браузер) должен раскодировать содержимое в исходный вид (например, распаковать, если сервер сжал отправляемый ресурс) и далее работать с ним на основе указанного Content-Type. Невозможно на 100% определить заранее, что картинка того или иного формата, но, как правильно подметил
Павел Волынцев, у большинства форматов есть сигнатура, по которой с вероятностью 99.9..% можно сказать, что прилетела PNG-шка или JPEG. В любом случае, правильно реализованная читалка (декордер) графических форматов должна быть готова к тому, что картинка может быть повреждена и должна выдавать ошибку, если разобрать картинку согласно предполагаемому формату невозможно.
Сами форматы растровых изображений (вектор не рассматриваем сейчас) как раз таки и различаются прежде всего: а) особенностями представления пиксельной карты (матрицы пискелей): как кодируется цвет, индексный или компонентный, сколько всего может быть различных значений цвета у пиксела, есть ли сжатие, какие алгоритмы сжатия применяются - без потерь (PNG) или с потерями (JPEG); б) служебной информацией: это может быть как базовая необходимая информация, например размеры картинки и размер одного пикселя в байтах (читай - сколько байт выделяется на цвет одного пиксела), так и дополнительная, например
EXIF, где можно указать и автора, и режим съемки и много чего еще; в) доп. фичами, которые и делают каждый формат особенным: поддержка анимации (GIF, MNG), поддержка сжатия с потерями (JPEG), поддержка слоев в картинках (фотошоповский PSD), поддержка "многостраничных" картинок (TIF) и так далее.
Конвертирование собственно сводится к:
1) определению исходного формата картинки;
2) чтению исходного формата с целью перевести его в удобное развернутое представление в памяти, удобное для программиста с точки зрения дальнейших операций (расжать, прочитать служебную инфу и т.д.)
3) записи полученного представления в памяти в новый формат, что опять таки подразумевает запись необходимых сигнатур и служебной инфы в соответствии со спецификацией формата, плюс преобразование изображения алгоритмами сжатия, если нужно (например, эффективность jpeg для фотоизображений достигается использованием довольно сложного и хитрого алгоритма кодирования, учитывающего восприятие цвета человеком, в том время как PNG сжимает почти как обычный архиватор, который никак не интерпретирует сжимаемые данные).
Надеюсь дальше понятно куда копать.