SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Системы и инструменты

Фото в двоичном виде: байты файла и пиксели

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 отличаются от бинаризации, где после порога остаются два значения. Выбор порога теряет информацию. Не называйте такой результат исходной фотографией без потерь и сохраняйте оригинал отдельно.

Документация