Почему мой 1-битный растровый рисунок 8x8 сохраняет в фотошопе больше 8 байт?

Я хочу, чтобы мой 8x8 выходил как необработанный двоичный файл; он должен быть 8 байт или 64 бита. Тем не менее, это выходит намного больше, чем это; сохранение в формате PNG дало мне 154 байта; сохранение в формате BMP дало мне 64 байта (в 8 раз больше, чем должно быть).

Когда я создал новое изображение, Photoshop сказал мне, что оно будет 8 байт, но после сохранения это явно не так.

Самый, самый низкий размер, который я мог получить, был 12 байт, используя сохранение для Интернета и сохранение как wbmp, но я хочу, чтобы он был 8 байт. Это должны быть необработанные двоичные данные. Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: И если на то пошло, другие низкие значения битов выходят выше, чем ожидалось. Почему 4-битное изображение 80x16 имеет размер 714 байт вместо 640?

Хорошо форматы изображений сохраняют больше, чем просто необработанные данные изображения
Это то, чего я пытаюсь достичь; необработанные данные изображения.
Поскольку Photoshop необходимо сохранить заголовок файла, который сообщает программам, какой у вас тип файла и как он должен его читать. Я не могу просто сохранить изображение как необработанное, так как ни одна программа не сможет его открыть. Могу я спросить, для чего вам нужны необработанные данные изображения?
Я делаю игру и пытаюсь сделать ее как можно меньше физически; один из способов сделать это — хранить необработанные цветовые индексы вместо «фактических цветов». который в данном случае 1-битный, только 0 и 1.
У вас есть опция «Сохранить как Raw» в вашем списке файлов для сохранения? Он в значительной степени делает то, что он говорит.

Ответы (1)

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

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

Аналогом реального мира было бы ведро. Хотя ведро довольно легкое, скажем, 300 г, его пропорциональный вес довольно мал, если вы наполните ведро 10 литрами воды (3%) или песка (2% теряет гравий). Однако относительный вес контейнера довольно значителен, если вы хотите перевезти сантилитр воды (3000%).

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

Так что делать?

  • Закодируйте все данные изображения в один файл изображения, называемый атласом изображения.
  • Запишите данные изображения в исходный код. Он все равно будет больше 8 байт из-за необходимости хранения длины массива. Хотя это может быть непрактично.
  • Напишите свой собственный формат, но вы все равно столкнетесь с проблемой контейнера. Опять же, лучше поместить несколько источников данных в один файл хранилища.
относительно 2: не обязательно; Массивы языка C нигде не хранят длину массива. и, кстати, вы можете автоматически сгенерировать такой исходный код C в Gimp — используйте формат файла «XBM»: 0xc0, 0x80, 0x00 };
@szulat да, но человек, который собирает изображение в массив элементов, должен знать, каковы высота и ширина, чтобы использовать этот массив осмысленно или чтобы избежать переполнения. В любом случае нужно как-то пометить, что это картинка 8 на 8. Даже если он жестко закодирован в считывателе, он все равно использует 2 байта данных или, может быть, это можно закодировать в одном байте, но все равно где-то используется некоторое пространство.
@szulat ваша демонстрация XMB показывает именно то, что я говорю, она хранит два значения ширины и высоты в исходном коде, что в общей сложности составляет 10 байтов использования памяти для колоссальных 25% накладных расходов на контейнер.
конечно, но с другой стороны, если использовать тот же алгоритм жестко закодированного для обработки миллиона растровых изображений 8x8, вы уже сэкономили 2x2x1000000-2x2 байта :-]
#define использует ровно 0 байт скомпилированного кода
@szulat Конечно, но тогда вы делаете атлас изображений, который работает даже без постоянного кодирования, поскольку накладные расходы падают.
Размер / формат и т. д. изображения не являются абсолютным требованием для хранения в изображении, насколько мне известно, если у вас где- то есть эти данные , может быть, было бы более разумно, если бы я сказал, что я не пытаетесь сохранить здесь «файл изображения», но только данные изображения?
@Omega напишите скрипт, который извлекает необработанные данные из файла PNG. Таким образом, даже если вы используете любое программное обеспечение, вы можете быстро скальпировать информацию.