Чтение и запись графических файлов с расширением .uimage
Библиотека UImage поддерживает свой собственный формат хранения изображения в файлах с расширением .uimage. Этот формат позволяет сохранить изображения, содержащие один, три или четыре канала, в несжатом виде. Все строки двумерной матрицы выстраиваются в одну строку. Порядок следования каналов: G, RGB или RGBA в зависимости от количества каналов. Каждый компонент цвета кодируется одним байтом.
Минус несжатого формата очевиден — это большой размер файла. Но есть и огромный плюс. Несжатый вид позволяет читать и записывать изображения любым языком программирования, поддерживающим бинарные данные.
Для изображений с одним каналом формат .uimage почти аналогичен бинарному формату PGM. Для изображений с тремя каналами формат .uimage почти аналогичен бинарному формату PPM. А вот для изображений с четырьмя каналами из стандартных форматов знаю лишь RAW RGBA из библиотеки .ImageMagick. Но этот формат ничего не знает ни о ширине изображения, ни о его высоте. Файл формата .uimage хранит всю необходимую информацию и даже теоретически данные можно сжать.. Но на данный момент это не реализовано.
Формат файла .uimage
Файл .uimage имеет следующий формат:
name — в первых шести байтах записывается название формата — строка UImage (регистр символов не имеет значения);
width — в следующих двух байтах хранится ширина изображения (число от 1 до 8000). Порядок выравнивания в Python: width.to_bytes(2, "big");
height — следующие два байта кодируют высоту изображения (число от 1 до 8000). Порядок выравнивания в Python: height.to_bytes(2, "big");
num_channels — последующий байт хранит количество каналов изображения в виде числа 1, 3 или 4;
type_img — следующий байт сейчас хранит только число 1, которое означает, что последующие данные кодируются одним байтом;
data — последующие байты кодируют пиксели изображения. Длина данных высчитывается по формуле:
if type_img == 1:
data_len = width * height * num_channels
Для сохранения изображения в файл .uimage в библиотеке UImage предназначены методы save_uimage_rgba(), save_uimage_rgb() и save_uimage_gray() объекта изображения. Загрузить изображение из файла .uimage позволяет метод load_uimage(). Пример:
from unicross_image.uimagergb import UImageRGB
img = UImageRGB.load("foto.jpg")
if img:
print(img) # UImageRGB(width=500, height=333)
# Сохранение .uimage
img.save_uimage_rgb("foto2.uimage")
else:
print("Не удалось загрузить изображение")
# Загрузка .uimage
img = UImageRGB.load_uimage("foto2.uimage")
if img:
print(img) # UImageRGB(width=500, height=333)
else:
print("Не удалось загрузить изображение")
Формат файла определяется по расширению файла, поэтому можно просто использовать методы load() и save() без явного указания типа файла:
from unicross_image.uimagergb import UImageRGB
img = UImageRGB.load("foto.jpg")
if img:
print(img) # UImageRGB(width=500, height=333)
# Сохранение .uimage
img.save("foto2.uimage")
else:
print("Не удалось загрузить изображение")
# Загрузка .uimage
img = UImageRGB.load("foto2.uimage")
if img:
print(img) # UImageRGB(width=500, height=333)
else:
print("Не удалось загрузить изображение")
Сохранение изображения PIL в файл .uimage
Класс UHelperPIL предназначен для выполнения загрузки и сохранения файла с расширением .uimage для библиотеки PIL. Инструкция импорта:
from unicross_image.uhelper_pil import UHelperPIL
Обратите внимание, если библиотека PIL недоступна, то подключение модуля приведет к исключению.
Сохранить изображение PIL в формате .uimage позволяет статический метод save_uimage(). Формат метода:
save_uimage(img_pil, <Название файла с расширением .uimage>)
В первом параметре указывается объект Image из библиотеки PIL, а во втором параметре — название файла с расширением .uimage. Если объект Image в форматах "RGBA", "RGB" или "L", то формат сохраняется. В противном случае производится преобразование формата в "RGBA". Если операция успешно выполнена, то метод вернет значение True, а в противном случае — значение False. Пример:
from PIL import Image
from unicross_image.uhelper_pil import UHelperPIL
img = Image.open("foto.jpg")
print(img.size) # (500, 333)
print(img.mode) # RGB
print(UHelperPIL.save_uimage(img, "foto.uimage")) # True
# Добавление альфа-канала
img2 = img.convert("RGBA")
print(img2.mode) # RGBA
print(UHelperPIL.save_uimage(img2, "foto2.uimage")) # True
# Преобразование в оттенки серого
img3 = img.convert("L")
print(img3.mode) # L
print(UHelperPIL.save_uimage(img3, "foto3.uimage")) # True
Загрузка изображения из файла .uimage
Загрузить изображение из файла в формате .uimage и преобразовать его в объект Image из библиотеки PIL позволяет статический метод load_uimage(). Формат метода:
load_uimage(<Название файла с расширением .uimage>)
В качестве параметра указывается название файла с расширением .uimage. Если операция успешно выполнена, то метод вернет объект Image из библиотеки PIL, а в противном случае — значение None. Пример:
from unicross_image.uhelper_pil import UHelperPIL
img = UHelperPIL.load_uimage("foto.uimage")
if img is not None:
print(img.size) # (500, 333)
print(img.mode) # RGB
img2 = UHelperPIL.load_uimage("foto2.uimage")
if img2 is not None:
print(img2.size) # (500, 333)
print(img2.mode) # RGBA
img3 = UHelperPIL.load_uimage("foto3.uimage")
if img3 is not None:
print(img3.size) # (500, 333)
print(img3.mode) # L
Класс входит в состав графической библиотеки UImage для Python 3. Описание библиотеки UImage