Визуализируйте буфер пикселей изображения с битовой глубиной 3, т.е. каждый пиксель имеет 3 бита данных

Вопрос

Каковы инструменты/стандарты/форматы файлов, с помощью которых я могу визуализировать буфер пикселей изображения, в котором каждый пиксель имеет 3 бит?

Мой язык — го.

PNG заголовок

Разрядность: 3 против 4

Создается буфер пикселей изображения, в котором каждый пиксель содержит только 3 бит данных. Сохранив его как файл PNG с заголовком и битовой глубиной, установленной на 3, я не могу его визуализировать:

Но когда для информации о битовой глубине заголовка PNG-файла установлено значение 4, меня можно просмотреть, хотя я не уверен, действительно ли предварительный просмотр правильный или неправильный:

Изменение, которое я вношу, — это просто информация заголовка о разрядности, вот и все. Мой код находится в Голанге:

    // Set bit depth and color type.

    e.tmp[8] = 3 // Preview is not possible.
    e.tmp[8] = 4 // Preview is possible.

    e.tmp[9] = ctGrayscale

стандарт PNG

Согласно Википедии у нас есть:

Стандарт позволяет индексированным цветам PNG иметь 1, 2, 4 или 8 бит на пиксель; Изображения в оттенках серого без альфа-канала могут иметь 1, 2, 4, 8 или 16 бит на пиксель. Все остальное использует битовую глубину на канал 8 или 16.

Вы пытались объединить 3 бита как минимум в 8 бит?

ih8ie8 27.08.2024 12:29

@ih8ie8 3-битный пиксельный буфер был создан для максимального уменьшения размера изображения. Подумайте об оптимизации использования памяти для огромных изображений с разрешением 8K, 10K, 16K и 32K.

Megidd 27.08.2024 12:34

Программы просмотра PNG специально обрабатывают 1,2,4 или 8 бит на пиксель, поскольку они прекрасно разделяют байты. Сколько различных цветов в вашем изображении? 4-битный буфер не будет таким уж большим успехом после того, как кодирование PNG обработает его, только используемые коды будут закодированы в сжатый выходной формат. Или наоборот, можно ли обойтись всего 4 цветами и 2 битами на пиксель?

Martin Brown 27.08.2024 13:57

@MartinBrown Спасибо. 3 биты дают мне 8 различных цветов. То есть это более 4 цветов 2 разрядности и менее 16 цветов 4 разрядности.

Megidd 27.08.2024 14:16

Во времена Java 1.2 (сейчас мы находимся на Java 22) даже для черно-белого изображения требовалось 8 бит на пиксель... С тех пор эту расточительность убрали, но я не был уверен, повлияло ли это на какой-то формат изображения. стандарты. Судя по всему, по словам @MartinBrown, проблема не в этом.

ih8ie8 27.08.2024 14:30

итак... вы просите назвать форматы изображений, которые не имеют 1/2/4/8/16-битного... "ограничения", которое есть у PNG? TIFF может это сделать. БМП может, ИДК. в любом случае сжатие избавляет от всех этих забот. -- если вы просто хотите визуализировать изображение со значениями пикселей 0..7 (3 бита), вы можете использовать ВСЁ, что может выполнять небольшие арифметические операции с изображением, чтобы растянуть его до обычных 8 бит (0..255). ). Python, массивы numpy, matplotlib, и все готово.

Christoph Rackwitz 27.08.2024 14:33

@ChristophRackwitz Спасибо. Из-за того, что я очень одержим использованием памяти, я не хочу растягивать каждый 3-битный пиксель до обычных 8 бит.

Megidd 27.08.2024 14:55

Как вы узнали, не существует такого понятия, как PNG в оттенках серого с 3 битами на пиксель. Может быть, вы ищете палитру из 8 цветов?

Volker 27.08.2024 15:12

@Volker Спасибо. Давайте я взгляну на изображения в палитре...

Megidd 27.08.2024 15:16

Но сколько цветов вам нужно? Я предлагаю вам попробовать сохранить образец файла в 4-битном режиме и посмотреть, насколько он сжат. Если пространство токена занято только от 0 до 7, то кодер учтет это при сжатии без потерь. Аналогично для любых больших областей одного цвета. Все режимы ISTR с уменьшенным количеством бит основаны на палитре, но может быть один с номинальной шкалой серого. Если вы действительно настаиваете на использовании 3bpp, используйте GIF — этот формат поддерживает его (но имеет значительно более слабое сжатие, поэтому в итоге вы можете получить файл большего размера).

Martin Brown 27.08.2024 15:21

@MartinBrown О, спасибо. Давайте я посмотрю гифку...

Megidd 27.08.2024 15:42

вы можете быть «очень одержимы использованием памяти», но тогда у вас не останется места, чтобы что-либо сделать. вы специально спрашивали об отображении таких данных. это обязательно требует его декодирования. Как вы думаете, как это должно работать без использования памяти? Я не вижу, чтобы этот вопрос можно было спасти.

Christoph Rackwitz 27.08.2024 16:26
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
12
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сохранив его как файл PNG с информацией в заголовке и битовой глубиной, установленной на 3.

Нет, ты этого не сделал. Как вы сами заметили в конце своего вопроса, такого понятия не существует. PNG поддерживает 1, 2, 4, 8 и 16 бит на пиксель. Все, что вы сохранили, не является допустимым файлом PNG, и все, что вы использовали для его просмотра, по праву отклонило его.

В PNG вам нужно будет использовать как минимум четыре бита на пиксель. Мне неизвестен формат изображения, который представляет несжатые данные как три бита на пиксель. Несжатое представление не должно иметь значения, поскольку оно временное. Либо вы сохраняете его как сжатый, где сжатие PNG в любом случае будет использовать примерно три бита на пиксель в сжатых данных, если используются только восемь значений из 16. Или вы сохраняете его в памяти в виде одного байта (8 бит на пиксель), чтобы доставить его туда, где он будет отображаться на экране.

Я только что попробовал сжатие PNG со случайными 3-битными значениями в 4-битных пикселях. Часть сжатых данных составляет 3,03 бита на пиксель.

Другие вопросы по теме