.rgba - самый простой формат обмена изображениями для вашего удовольствия от программирования.

TL;DR

Присоединяйтесь ко мне в поддержке этого самого тупого из всех возможных форматов растровых изображений, чтобы всем было проще писать небольшие инструменты и программы с изображениями. Он называется RGBA, и в нем хранятся ваши данные RGBA. Вот бесплатный код, если хотите, но вся спецификация уже написана. Имейте это в виду.

К чему эта революционная идея ?! а почему именно сейчас?

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

Если вы программист, работающий с изображениями или растровыми данными, вы знакомы с идеей необработанного растрового изображения в памяти, которое в наши дни почти всегда представляет собой один большой линейный буфер размером 4 байта на пиксель в формате RGBA. Вы будете в равной степени знакомы со всеми неприятностями, связанными с переносом этих данных в файл, сеть и т. Д. И из них.

Почему? Потому что, хотя с растровым изображением в памяти очень легко работать, все файлы сложны, разработаны с учетом вычислительных ограничений и разнообразного графического оборудования 1990-х (!). Все эти стандарты требуют, чтобы вы использовали сложные библиотеки и фреймворки для работы с ними.

Если вы хотите, чтобы ваш код оставался самодостаточным и простым, вариантов не так много. PNG и GIF нетривиальны; JPEG заставит с криком бежать. Даже формат BMP от Microsoft, который является ближайшим к сырым форматом по распространенности, становится слишком сложным, как только вы начинаете его разбирать. Вот удобная диаграмма, иллюстрирующая различные субформаты пикселей, поддерживаемые BMP:

Кому, черт возьми, нужно кодировать и декодировать индексированные данные RLE палитры с 4 битами на пиксель в этом футуристическом 2021 году? НИКТО. Диски большие и дешевые, сети быстрые. RGBA подойдет, даже если вы используете только несколько цветов!

Так что в некотором смысле .rgba является духовным преемником Windows BMP - перегонкой самой его сути в единую и минимальную форму, которую подавляющее большинство этих файлов и так использовали.

Вот спецификация формата файла:

  • 32-битное «магическое число» для идентификации файла. Это символы RGBA в указанном порядке.
  • 32-битная ширина (в пикселях). С прямым порядком байтов.
  • 32-битная высота (в пикселях). С прямым порядком байтов.
  • Данные пикселей: 4 байта на пиксель, по одному байту на каждый R, G, B, A. Всегда в таком порядке. Растровое изображение начинается в верхнем левом углу изображения и сканирует каждую строку до самого низа. Никаких отступов нигде нет. Таким образом, общая длина данных пикселей будет равна width * height * 4, а формула для доступа к первому байту (красный канал) любого пикселя будет: pixel_data[(y * width * 4) + (x * 4)]

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

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

F.A.Q.s

Какое расширение у этих файлов?

.rgba конечно.

Разве эти файлы не большие?

Лол, может быть. Но как и ваш диск, и ваш Dropbox, и ваша оперативная память, так что кого это волнует. Очевидно, это не означает, что он заменяет разумный JPEG. Просто вариант, когда вы создаете простые инструменты.

Могу ли я хранить пиксели в порядке ARGB или BGRA?

Нет, нельзя! Это прямо в названии. Я имею в виду, что вы можете делать все, что хотите, но файл .rgba будет правильным только в том случае, если он находится в реальном порядке RGBA (он же R8G8B8A8). Это был своего рода сложный вызов, потому что есть несколько довольно разумных сценариев, по которым вам может быть удобно, если данные файла будут точно сопоставлены с вашими немного разными, например. макет текстуры.

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

Дело в ясности, простоте и портативности. Возможно, вам придется немного изменить данные при чтении или записи. Но если вы уже читаете большое несжатое изображение, неужели это так много лишней работы? :)

Куда идут другие метаданные изображения?

Это не так! Я полагаю, вы могли бы добавить дополнительные данные в предпочитаемом вами формате после данных пикселей. Достаточно разумный декодер, вероятно, просто проигнорирует это? Но я не поощряю и не противодействую такому образу действий.

Как указать цветовое пространство? Разве мне это не нужно?

Я даже не понимаю, что означает эта гамма. Тебе не хватает 16 миллионов цветов ?? Если вам нужно сделать предположение о цветовом пространстве, используйте sRGB (также известный как Стандартный RGB), потому что это 99,9% растровых данных, которые кому-то небезразличны в реальном мире. (Если вы выполняете работу по разграничению цветовых пространств, вероятно, вам нужен другой формат файла.)

Мои растровые изображения никогда не используют прозрачность! Файлы на 33% больше!

Вздох. Да, это справедливый вопрос, и это самый веский аргумент в пользу того, чтобы разрешить более одного вида байтового формата. Но здесь побеждает простота. Может, в следующем формате. :)

Предварительно умножен альфа-канал?

Нет. А если у вашего изображения нет прозрачности, просто используйте 0xFF для альфа-канала.

А как насчет выравнивания?

Все (три поля заголовка и каждый пиксель), естественно, выровнено по 32 бита, и никаких отступов нигде не требуется (или разрешено). Этого должно хватить для большинства нужд.

(Существуют гипотетические случаи, когда вы можете захотеть загрузить данные непосредственно в буфер, который выигрывает от 64-битного выравнивания. Вы, конечно, можете загрузить растровое изображение отдельно от полей заголовка и убедиться, что ваша ширина кратна двум.)

Чем .rgba превосходит конкурентов?

В простоте реализации и скорости чтения / записи. Любой сжатый формат более сложен (PNG, GIF или, боже мой, JPEG). Windows BMP является наиболее близким к разрешению необработанных данных, но вам все равно нужно возиться с кучей полудокументированных полей заголовков и правильно выбирать битовые маски. Любой формат файла, для которого требуется набор различных файлов примеров для разумной проверки декодера, недостаточно прост!

Ты кто, черт возьми?

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