Этот вопрос был дан довольно подробный ответ ранее. Однако, несмотря на то, что в ответах представлено много теории, я чувствую, что есть некоторые базовые предметы, обычно связанные с компьютерным программированием, которые требуют большего разъяснения. Я должен заявить, что я инженер-программист. После того, как я прочитал вопрос, я понял, что есть совершенно неправильное понимание основных типов данных программирования, которые породили этот вопрос.
Первый вопрос здесь:
Далее, с цифровой точки зрения, что делает что-то вроде 16-битного
изображения, отличные от 32-битных изображений? Опять же, изображение это просто массив
с целочисленными значениями от 0 до 255.
Как представлено ранее: Нет, это не так. Изображение - это не просто массив целочисленных значений в диапазоне 0-255. На самом деле это может быть одиночный или многомерный массив значений от 0 до 65535, массив от 0 до 4294967295 или даже массив битов (бит может содержать значения 0 или 1, вот и все), который преобразуется программным обеспечением, способным читать файлы изображений в целые числа в соответствии с различными правилами кодирования.
Чтобы понять это далее, как было сказано ранее, я думаю, что необходимо обсудить основные типы данных программирования. Я постараюсь объяснить их как можно проще, чтобы кто-нибудь понял проблемы, связанные с хранением целочисленных значений в компьютерных файлах.
В компьютерном программировании мы используем некоторые базовые примитивные типы данных для записи значений в файлы, считывания их из файлов в память компьютера, манипулирования этими значениями с использованием различных типов данных конкретных языков программирования и в конечном итоге сохранения их обратно в файлы. Целые числа в компьютерном программировании - это не просто целые числа. Есть все виды целых чисел, в зависимости от языка программирования, который мы используем и сколько памяти нам нужно для каждого. Как правило, в большинстве языков программирования у нас есть следующие типы данных (и способы управления ими):
- BIT - удержание 0 или 1
- UINT8 - 8-битное целое число без знака - они могут содержать значения в интервале от [0 до 255].
- INT8 - 8-битное целое число со знаком - они могут содержать значения в интервале от [-126 до 127].
- UINT16 - 16-разрядное целое число без знака - они могут содержать значения в интервале от [0 до 65535].
- INT16 - 16-разрядное целое число без знака - они могут содержать значения в интервале от [−32768 до 32767].
- UINT32 - 32-разрядное целое число без знака - они могут содержать значения в интервале от [0 до 4294967295].
- INT32 - 32-разрядное целое число без знака - они могут содержать значения в интервале от [−2147483648 до 2147483647].
- ИЛИ комбинация всех этих типов данных в более сложном формате. Например, UINT16 (16 бит), содержащий 3 различных значения, первые 4 биты, содержащие значения от 0 до 127, следующий бит с 0 или 1 и т. Д.
Далее БОЛЬШЕ есть что-то, с чем программистам приходится сталкиваться при чтении или записи целочисленного типа данных из файлов. Порядковый номер. Порядковый номер относится к последовательному порядку, в котором байты (UINT8 из нашей таблицы) располагаются в большие числовые значения при хранении в памяти или файлах. Порядковый номер представляет интерес в компьютерной науке, потому что два конфликтующих и несовместимых формата широко используются: значения могут быть представлены в формате с прямым порядком байтов или с прямым порядком байтов, в зависимости от того, упорядочены ли биты, байты или другие компоненты с большого конца (наиболее значимый) немного) или маленький конец (наименее значимый бит). Проще говоря, вы можете сохранить значение, например, 0000000011011111 или ... как 1101111100000000, в зависимости от выбранного порядка байтов. И вы можете выбрать любой заказ, который соответствует вашим целям. Нет других правил, которые вы применяете при разработке формата файла изображения.
Обратите внимание, что в компьютерном программировании целые числа используют больше или меньше места, зависит от значения. Как будто вам нужно больше бумаги, чтобы написать 255255255, вам нужно больше битов, чтобы написать большее значение. Затем, когда вы захотите прочитать значение, вы должны точно знать правила, которые вы создали, когда писали его. В противном случае вы не сможете понять, как мы читаем просто просто массив с целочисленными значениями от 0 до 255 , потому что вы просто не знаете, где хранятся эти числа и как эти числа хранятся, имея так много вариантов выбора. у вас есть (BIT, UINT8, UINT16, UINT32 или комбинация всех этих типов данных компьютера). И не забывай, Endianness. Если вы не знаете, что данные были записаны с использованием порядка с прямым или прямым порядком байтов, вы не сможете прочитать правильное значение.
Из-за этого изображения НИКОГДА не являются просто массивом с целочисленными значениями от 0 до 255. Некоторые из них являются массивами UINT16 (16-битные изображения), другие являются массивами UINT32 (32-битные изображения) или другие являются массивами UINT8 (8-битные) изображений). Некоторые очень креативные программисты могут даже использовать подписанные типы, которые используют вас в массивах INT8, что означает массив значений от -126 до 127.
На самом деле, когда вы читаете файл изображения, одним из первых данных, с которыми вы сталкиваетесь, обычно являются биты, представляющие ширину и высоту изображения. И это не просто 0-255 значений. Это также некоторые типы данных, выбранные программистом. Некоторые программисты подумают, что 16 битов достаточно для хранения максимальной ширины изображения 65535 пикселей, потому что они проектируют формат изображения, используемый в игре, чтобы сохранить изображения маленьких кнопок. Некоторые другие программисты могут использовать здесь 32-битное значение, позволяющее хранить изображения вплоть до ширины и высоты 4294967295. Некоторые сумасшедшие программисты NASA могут даже использовать 64-битные для хранения огромных фотографий галактики размером до 18446744073709551615 пикселей. Если вы не знаете правил, вы не можете читать эти «значения» так, как вы их называете. Потому что вы не знаете, где они начинаются в файле изображения и где они заканчиваются. Таким образом, вы получите кучу битов, о которых ничего не понимаете.
Вот почему вселенная полна множества различных форматов изображений. Потому что не существует стандартного решения для записи некоторых целочисленных значений в файл. Это выбор программиста, полностью основанный на многих факторах, таких как Endianess машины, на которой вы работаете, язык программирования, который вы используете для разработки оригинальной реализации формата файла, и многие другие вещи, такие как назначение формата изображения (как четко было сказано ранее другие ответы).
Практичный простой формат файла черно-белого изображения, который содержит только одно значение 166 для представления изображения 4x2 пикселей:
Изображение (1 - черный пиксель, 0 - белый пиксель):
1010
0110
В этом формате файла используется 1 БИТ на ПИКСЕЛ, сохраненный в виде ЕДИНОГО 8-битного целочисленного значения 166 (10100110). Это все. Массив значений 0-255 не используется, но 8 различных значений 0 или 1 хранятся как значения 166.
Если вы использовали массив значений 0-255 для каждого пикселя * 3 раза для RGB, вы получите изображение в 24 раза больше. Этот формат файла просто сэкономил в 24 раза больше дискового пространства, необходимое для сохранения изображения, подобного этому, или в 24 раза меньше памяти компьютера, необходимой для чтения и сохранения этого изображения в оперативной памяти компьютера, когда вы используете это изображение, например, в своем высокопроизводительном движке 3D-игр для Нарисуйте что-нибудь на экране (текстурирование тысяч летящих частиц пыли может быть хорошим кандидатом :)).