Каковы инструменты/стандарты/форматы файлов, с помощью которых я могу визуализировать буфер пикселей изображения, в котором каждый пиксель имеет 3
бит?
Мой язык — го.
Создается буфер пикселей изображения, в котором каждый пиксель содержит только 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 иметь 1, 2, 4 или 8 бит на пиксель; Изображения в оттенках серого без альфа-канала могут иметь 1, 2, 4, 8 или 16 бит на пиксель. Все остальное использует битовую глубину на канал 8 или 16.
@ih8ie8 3-битный пиксельный буфер был создан для максимального уменьшения размера изображения. Подумайте об оптимизации использования памяти для огромных изображений с разрешением 8K, 10K, 16K и 32K.
Программы просмотра PNG специально обрабатывают 1,2,4 или 8 бит на пиксель, поскольку они прекрасно разделяют байты. Сколько различных цветов в вашем изображении? 4-битный буфер не будет таким уж большим успехом после того, как кодирование PNG обработает его, только используемые коды будут закодированы в сжатый выходной формат. Или наоборот, можно ли обойтись всего 4 цветами и 2 битами на пиксель?
@MartinBrown Спасибо. 3
биты дают мне 8 различных цветов. То есть это более 4 цветов 2
разрядности и менее 16 цветов 4
разрядности.
Во времена Java 1.2
(сейчас мы находимся на Java 22) даже для черно-белого изображения требовалось 8 бит на пиксель... С тех пор эту расточительность убрали, но я не был уверен, повлияло ли это на какой-то формат изображения. стандарты. Судя по всему, по словам @MartinBrown, проблема не в этом.
итак... вы просите назвать форматы изображений, которые не имеют 1/2/4/8/16-битного... "ограничения", которое есть у PNG? TIFF может это сделать. БМП может, ИДК. в любом случае сжатие избавляет от всех этих забот. -- если вы просто хотите визуализировать изображение со значениями пикселей 0..7 (3 бита), вы можете использовать ВСЁ, что может выполнять небольшие арифметические операции с изображением, чтобы растянуть его до обычных 8 бит (0..255). ). Python, массивы numpy, matplotlib, и все готово.
@ChristophRackwitz Спасибо. Из-за того, что я очень одержим использованием памяти, я не хочу растягивать каждый 3-битный пиксель до обычных 8 бит.
Как вы узнали, не существует такого понятия, как PNG в оттенках серого с 3 битами на пиксель. Может быть, вы ищете палитру из 8 цветов?
@Volker Спасибо. Давайте я взгляну на изображения в палитре...
Но сколько цветов вам нужно? Я предлагаю вам попробовать сохранить образец файла в 4-битном режиме и посмотреть, насколько он сжат. Если пространство токена занято только от 0 до 7, то кодер учтет это при сжатии без потерь. Аналогично для любых больших областей одного цвета. Все режимы ISTR с уменьшенным количеством бит основаны на палитре, но может быть один с номинальной шкалой серого. Если вы действительно настаиваете на использовании 3bpp, используйте GIF — этот формат поддерживает его (но имеет значительно более слабое сжатие, поэтому в итоге вы можете получить файл большего размера).
@MartinBrown О, спасибо. Давайте я посмотрю гифку...
вы можете быть «очень одержимы использованием памяти», но тогда у вас не останется места, чтобы что-либо сделать. вы специально спрашивали об отображении таких данных. это обязательно требует его декодирования. Как вы думаете, как это должно работать без использования памяти? Я не вижу, чтобы этот вопрос можно было спасти.
Сохранив его как файл PNG с информацией в заголовке и битовой глубиной, установленной на 3.
Нет, ты этого не сделал. Как вы сами заметили в конце своего вопроса, такого понятия не существует. PNG поддерживает 1, 2, 4, 8 и 16 бит на пиксель. Все, что вы сохранили, не является допустимым файлом PNG, и все, что вы использовали для его просмотра, по праву отклонило его.
В PNG вам нужно будет использовать как минимум четыре бита на пиксель. Мне неизвестен формат изображения, который представляет несжатые данные как три бита на пиксель. Несжатое представление не должно иметь значения, поскольку оно временное. Либо вы сохраняете его как сжатый, где сжатие PNG в любом случае будет использовать примерно три бита на пиксель в сжатых данных, если используются только восемь значений из 16. Или вы сохраняете его в памяти в виде одного байта (8 бит на пиксель), чтобы доставить его туда, где он будет отображаться на экране.
Я только что попробовал сжатие PNG со случайными 3-битными значениями в 4-битных пикселях. Часть сжатых данных составляет 3,03 бита на пиксель.
Вы пытались объединить 3 бита как минимум в 8 бит?