Язык программирования Python

Кодирование и декодирование изображений Base64 с помощью Python

Допустим, вам нужно передать по сети бинарный графический файл.

Когда вы это сделаете, вы с удивлением обнаружите, что файл был неправильно принят на другом конце, и что он содержит странные символы. Это происходит потому, что вы пытаетесь отправить файл в формате байтов, в то время как используемый канал предназначен для передачи текста.

Каким должно быть решение, чтобы избежать такой проблемы?

Ответ кроется в кодировке Base64. В этой статье я собираюсь показать, как мы можем использовать Python для кодирования и декодирования двоичного изображения.

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

Что такое кодирование Base64?

Прежде чем перейти к этому, давайте определим, что мы подразумеваем под Base64.

Base64 – это способ, с помощью которого 8-битные двоичные данные кодируются в формат, который можно представить в 7 битах. Для этого используются только символы A-Z, a-z, 0-9, + и / для представления данных. Символ = используется для данных прокладок. Например, при таком кодировании три 8-битных байта превращаются в четыре 7-битных байта.

Термин base 64 происходит от стандарта Multipurpose Internet Mail Extensions (MIME), который широко используется для HTTP и XML, и изначально был разработан для кодирования вложений электронной почты и их правильной передачи.

Для чего мы используем Base64?

Base64 очень важен для отображения двоичных данных, настолько, что позволяет представлять двоичные данные так, что они выглядят и ведут себя как обычный текст. Это делает более безопасным их хранение в базах данных, отправку по электронной почте или использование в текстовых форматах, таких как XML.

Base64 в основном используется для представления данных в формате ASCII.

Как мы уже говорили во введении к этой статье, без Base64 данные вообще не могут быть прочитаны.

Кодирование Base64

Кодирование Base64 – это процесс преобразования двоичных данных в набор символов, ограниченный 64 символами. Как мы уже говорили в первом разделе, это символы A-Z, a-z, 0-9, + и / (Вы посчитали их? Вы заметили, что в сумме они составляют 64?). Этот набор символов считается наиболее распространенным и известен как Base64 в MIME. Он использует A-Z, a-z, 0-9, + и / для первых 62 значений и + и / для последних двух значений.

Закодированные в Base64 данные в итоге оказываются больше исходных данных, поэтому, как мы уже говорили, на каждые 3 байта двоичных данных приходится как минимум 4 байта закодированных в Base64 данных. Это связано с тем, что вы сжимаете данные в меньший набор символов.

Вы когда-нибудь видели необработанный файл электронной почты, подобный тому, который показан ниже? Если да, то вы видели кодирование Base64 в действии.

Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix 2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5 2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg== --089e0141aa264e929a0514593016 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64

Кодирование Base64 выполняется в несколько этапов:

  1. Текст, который необходимо закодировать, преобразуется в соответствующие десятичные значения, т.е. в его ASCII-эквивалент (например, a: 97, b: 98 и т.д.).
  2. Десятичные значения, полученные на предыдущем этапе, преобразуются в их двоичные эквиваленты (т.е. 97: 01100001).
  3. Все двоичные эквиваленты объединяются, в результате чего получается большой набор двоичных чисел.
  4. Большой набор двоичных чисел разделен на равные части. Каждая секция должна содержать только 6 бит.
  5. Равные наборы из 6 битов преобразуются в их десятичные эквиваленты.
  6. Наконец, десятичные эквиваленты преобразуются в свои значения Base 64 (т.е. 4:E).

Декодирование Base64

Декодирование Base64 противоположно кодированию Base64. Другими словами, это делается путем обратных действий, описанных в предыдущем пункте.

Таким образом, этапы декодирования Base64 можно описать следующим образом:

  1. Каждый символ в строке изменяется на его десятичное значение Base64.
  2. Полученные десятичные значения преобразуются в их двоичные эквиваленты.
  3. Первые два бита двоичных чисел усекаются для каждого из полученных двоичных чисел, и наборы из 6 бит объединяются, образуя большую строку двоичных цифр.
  4. Большая строка двоичных цифр, полученная на предыдущем этапе, делится на наборы из 8 бит.
  5. 8-битные двоичные числа преобразуются в их десятичные эквиваленты.
  6. Наконец, полученные десятичные значения преобразуются в их эквиваленты ASCII.

Кодирование изображения

Теперь перейдем к сути дела. В этом разделе я покажу вам, как мы можем легко закодировать изображение в Base64 с помощью Python. Для этого я собираюсь использовать следующий двоичный образ. (Имя файла изображения – deer.gif).

Первое, что нам нужно сделать, чтобы использовать Base64 в Python, – это импортировать модуль Base64:

import base64
Code language: JavaScript (javascript)

Для кодирования нашего изображения в Base64 нужно сделать следующее:

import base64 image = open('deer.gif', 'rb') #открывает двоичный файл в режиме чтения image_read = image.read() image_64_encode = base64.encodestring(image_read)
Code language: PHP (php)

Если вы хотите увидеть результат процесса кодирования, введите следующее:

print image_64_encode
Code language: PHP (php)

Декодирование изображения

Чтобы декодировать изображение с помощью Python, мы просто используем функцию base64.decodestring(s).

Таким образом, чтобы декодировать изображение, которое мы закодировали в предыдущем разделе, делаем следующее:

base64.decodestring(image_64_encode)
Code language: CSS (css)

Собираем все вместе

Давайте соберем код, которая кодирует и декодирует изображение Base64.

import base64 image = open('deer.gif', 'rb') image_read = image.read() image_64_encode = base64.encodestring(image_read) image_64_decode = base64.decodestring(image_64_encode) image_result = open('deer_decode.gif', 'wb') # создание изображения, доступного для записи, и запись результата декодирования image_result.write(image_64_decode)
Code language: PHP (php)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *