Фото в двоичном виде: байты файла и пиксели
JPEG или PNG уже хранится как двоичный файл. Есть две разные задачи: увидеть биты файла вместе с заголовками/сжатием или получить значения пикселей после декодирования. Преобразование в серый цвет нужно только второй задаче, если вы хотите именно яркость.
Биты файла
from pathlib import Path
with Path("photo.jpg").open("rb") as stream:
first_bytes = stream.read(16)
print(" ".join(f"{byte:08b}" for byte in first_bytes))Первые16 байтов обычно относятся к структуре формата, а не к первым16 пикселям. Текстовое представление из нулей и единиц намного больше исходных байтов; не распечатывайте целое большое изображение без необходимости.
Яркость пикселя
from PIL import Image
with Image.open("photo.jpg") as source:
gray = source.convert("L")
value = gray.getpixel((0, 0))
print(value, f"{value:08b}")В режиме L значение яркости занимает8 бит. Число128 даёт 10000000. Это не значит, что весь исходный цветной файл теперь можно описать одним таким числом: нужны остальные пиксели, размер и способ интерпретации.
Чёрно-белое и оттенки серого
Оттенки серого0…255 отличаются от бинаризации, где после порога остаются два значения. Выбор порога теряет информацию. Не называйте такой результат исходной фотографией без потерь и сохраняйте оригинал отдельно.