Как интерпретировать двоичное растровое изображение, чтобы я знал, какой цвет на какой пиксель я меняю при изменении чего-либо в коде? - PullRequest
0 голосов
/ 13 ноября 2018

Я просто использовал этот код для преобразования изображения в двоичный файл:

import io
tme = input("Name: ")
with io.open(tme, "rb") as se:
  print(se.read())
  se.close()

Теперь это выглядит так:

5MEMMMMMMMMMMMMM777777777777777777777777777777777\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95\x95MEEMMMMEEMM\x96\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97\x97

И теперь я хочу иметь возможность интерпретировать то, что этот двоичный код говорит мне точно ... Я знаю это хрипло, но недостаточно, чтобы иметь возможность делать что-либо нарочно. Я искал в Интернете, но я не нашел ничего, что могло бы помочь мне в этом вопросе. Можете ли вы сказать мне, как это работает, или пришлите мне ссылку, где я могу прочитать, как это делается?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы не можете просто изменить случайные байты в изображении. В начале есть заголовок с высотой и шириной, возможно, датой и палитрой, а также информацией о количестве каналов и бит на пиксель. Затем есть данные изображения, которые часто дополняются и / или сжимаются.

Итак, вам нужна библиотека изображений, такая как PIL / Pillow, и код чего-то вроде этого:

from PIL import Image

im = Image.open('image.bmp').convert('RGB')
px = im.load()

# Look at pixel[4,4]
print (px[4,4])

# Make it red
px[4,4] = (255,0,0)

# Save to disk
im.save('result.bmp')

Документация и примеры доступны здесь .

0 голосов
/ 13 ноября 2018

Вывод должен быть напечатан в шестнадцатеричном формате.Первые байты в растровом файле: 'B' и 'M'.

Вы пытаетесь распечатать содержимое в ASCII.Более того, он не показывает первые байты, потому что контент прокручивается дальше вниз.Добавьте print("start\n"), чтобы убедиться, что вы видите начало вывода.

import io
import binascii
tme = 'path.bmp'
print("start") # make sure this line appears in console output
with io.open(tme, "rb") as se:
  content = se.read()

print(binascii.hexlify(content))

Теперь вы должны увидеть что-то вроде

start
b'424d26040100000000003...

42 в шестнадцатеричном видезначение для B
4d - шестнадцатеричное значение для M ...
Первые 14 байтов в файле BITMAPFILEHEADER
Следующие 40 байтов BITMAPINFOHEADER

Байтами после этого являются таблица цветов (если есть) и, наконец, фактические пиксели.

См. BITMAPFILEHEADER и BITMAPINFOHEADER

...