Если картинка в несжатом формате, например, BMP, наверное, можно прямо с диска читать массив пикселей, разобравшись с форматом файла.
Для сжатых форматов понадобится сначала распаковать изображение. Например, для PNG и библиотеки GD функцией
imagecreatefrompng()
GD не документирует прямой доступ к области памяти, где хранятся пиксельные данные полученного ресурса imageresource. Поэтому с ней единственный вариант перебирать в цикле.
Посмотрите, что умеет
ImageMagick. Например
getImageColors()