
- •Растровые файлы
- •Идентификатор файла
- •Неиспользуемое пространство
- •Пример 1: Заголовок формата Microsoft Windows Bitmap, версия 1.Х
- •Пример 2: Заголовок формата Sun Raster
- •Пример 3: Заголовок формата Kofax Raster
- •Оптимизация чтения заголовка
- •Организация данных в виде плоскостей
- •Фрагменты
- •Палитра
Оптимизация чтения заголовка
Чтение данных заголовка может осуществляться различными способами. Проанализировав, как ваша программа использует имеющиеся данные, вы можете оптимизировать скорость чтения. Если вам нужны не все данные из заголовка, то программа может рассчитать смещение требуемых данных относительно некоторого контрольного ориентира, например относительно начала файла, найти и прочесть их. Смещения полей от начала заголовка, приведенные в комментариях к примерам, могут быть использованы для поиска нужных данных.
Если программе требуется большинство из содержащихся в заголовке данных, то, вероятно, целесообразно прочесть весь заголовок в буфер или специально выделенную для этих целей структуру данных. Такое чтение, как правило, выполняется очень быстро. После этого все данные заголовка становятся доступными в памяти и при необходимости могут быть кэшированы для дальнейшего использования. Однако если порядок байтов в словах в системе, в которой записывался файл, отличается от принятого в системе, в которой файл читается, может возникнуть проблема. Например, большинство функций блочного чтения файлов не предусматривают автоматического преобразования данных. Другая проблема может возникнуть в том случае, если компилятор или среда исполнения программы выравнивают элементы структуры по определенной границе.
Растровые данные
Реальные растровые данные обычно занимают большую часть растрового файла. В большинстве форматов растровых файлов растровые данные располагаются непосредственно после заголовка, но могут размещаться и в любом другом месте файла. Вместе с ними могут храниться палитра и другие данные. В таком случае в заголовке в поле смещения данных изображения (либо в документации) указывается местоположение начала данных изображения в файле.
Структура растровых данных в большинстве форматов довольно проста. Растровые данные состоят из пиксельных значений. На устройстве вывода пиксели обычно выводятся в виде строк развертки по всей ширине поверхности отображения, и этот факт, как правило, определяет порядок расположения данных в файле. Поэтому информация о том, на какое устройство вывода ориентировался разработчик формата, возможно, поможет вам "вычислить" точный порядок расположения данных.
Строки развертки объединяют пиксельные данные в двухмерную сетку, что позволяет нам рассматривать местоположение каждого пикселя растра в заданных логических координатах. Растр может быть представлен и в виде последовательности значений, которые логически отображают в файле растровые данные, соответствующие картинке на поверхности отображения устройства вывода. Реальные растровые данные обычно составляют большую часть любого растрового файла.
Как растровые данные записаны в файле
Как правило, программа, прежде чем сохранить изображение в файле, накапливает данные в одном или нескольких блоках памяти, которые могут находиться в оперативной памяти компьютера или на устройстве внешней памяти. Точный порядок расположения данных зависит от нескольких факторов, к которым можно отнести общий объем оперативной памяти, объем памяти, доступный данной программе, а также те операции, которые применялись для накопления данных или их записи в файл. Однако записанные в файл растровые данные обычно организованы одним из двух способов: в виде строк развертки или в виде плоскостей.
Организация данных в виде строк развертки
Первым и простейшим является способ организации пиксельных значений в виде строк развертки. Если мы рассмотрим любое изображение, построенное из одной или нескольких строк развертки, то пиксельные данные в файле, описывающем это изображение, будут представлять собой последовательности наборов значений, где каждый набор будет соответствовать строке изображения. Несколько строк представляются несколькими наборами, записанными в файле от начала до конца. Этот метод является общим при сохранении данных изображения, организованных в строки.
Если нам известен размер каждого пикселя в изображении и количество пикселей в строке, то мы можем рассчитать смещение начала каждой строки в файле. Например, в изображении, использующем 8 битов на пиксель, каждое пиксельное значение занимает один байт. Если ширина изображения равна 21 пикселю, то строки в файле будут представлены наборами пиксельных значений размером 21 байт. В этом случае строки в файле будут иметь следующие смещения от начала растровых данных: 0, 21, 42, 63 байта и т.д.
Некоторые компьютеры и форматы требуют, чтобы строки данных изображения занимали четное количество байтов. Например, весьма распространено правило, согласно которому строки растровых данных должны быть выровнены по границе двойного слова (4 байта). В этом случае рассмотренное выше изображение шириной 21 пиксель будет сохранено в файле в виде наборов пиксельных значений длиной 24 байта, а строки будут иметь начальные смещения 0, 24, 48, 72. Лишние 3 байта в каждой строке — это заполнители. В нашем примере для хранения каждой строки растра требуется 3 дополнительных байта и изображение шириной в 21 пиксель потребует такого же объема памяти, как изображение шириной в 24 пикселя. На практике такая нерациональность при сохранении изображения обычно (но не всегда) компенсируется выигрышем в скорости за счет использования возможности компьютера быстро манипулировать 2 или 4 байтами одновременно. Реальная ширина изображения всегда доступна программе визуализации (из заголовка файла).
В 4-битовом изображении каждый пиксель соответствует одному полубайту, и данные сохраняются по два пикселя в байте, хотя хранение в виде 1-байтовых пиксельных значений упрощает чтение этих данных и используется на практике.