Реализация LZW алгоритма сжатия с использованием возможностей современных GPU

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?тить первые 380 строк и обработать только те полосы, смещения которых записаны в последних десяти элементах массива тега StripOffsets. Если смещение не указано, то для определения начальной позиции последних 100 строк необходимо читать все изображение с его начала.

Фрагменты. Полосы не являются единственно возможным способом организации растровых данных. В TIFF 6.0 представлена концепция разделения растровых данных на фрагменты. Полоса - это одномерный объект, имеющий только длину, а фрагмент можно рассматривать как двухмерные блоки (полосы), имеющие длину и ширину (подобно растру). Фактически каждый фрагмент изображения можно рассматривать как сегмент растра. Таким образом, изображение представляется в виде совокупности сегментов, называемых в спецификациях TIFF фрагментами, с учетом их местоположения в оригинале изображения.

Разделение изображения на прямоугольные фрагменты имеет огромное преимущество (особенно в случае очень больших изображений с высоким разрешением) по сравнению с разделением на горизонтальные полосы.

Многие алгоритмы сжатия, и в частности JPEG, для сжатия данных используют двухмерные фрагменты - блоки, а не одномерные полос. Хранение сжатых данных в виде фрагментов способствует ускорению дешифровки данных. Концепции разделения данных изображения на фрагменты (сегменты) включены в спецификацию TIFF 6.0.

Если вместо полос применяются фрагменты, то три тега, описывающие полосы (RowsPerStrip, StripByteCounts и StripOffsets), заменяются тегами TileWidth, TileLenght, TileOffsets и TileByteCounts. Их предназначение и способ применения фактически те же, что и у тегов, описывающих полосы. Подобно полосам все фрагменты могут быть либо несжатыми, либо сжатыми по одной схеме. Изображения TIFF могут быть разделены либо только на полосы, либо только на фрагменты.

Теги TileWidth и TileLenght описывают размер фрагментов данных изображения. Их значения должны быть кратными 16, а все фрагменты субфайла должны иметь один размер. Это очень важно для некоторых программ особенно в случае применения ориентированной на фрагменты схемы сжатия JPEG. Спецификация TIFF 6.0 рекомендует, чтобы фрагменты были прямоугольной форма и содержали (до сжатия) от 4 до 32 Кб данных изображения.

Значения тегов TileWidth и TileLenght могут применяться для определения количества фрагментов субфайлов изображений, отличных от YCbCr:

= (ImageWidth + (TileWidth - 1)) / TileWidth;= (ImageLength + (TileLength - 1)) / TileLength; = TilesAcross * TilesDown;

Если изображение разделено на плоскости (PIanarConnguration = 2), то количество фрагментов можно вычислить следующим образом:

== TilesAcross * TilesDown * SamplesPerPixel;

Тег TileOnffets содержит массив смещений первых байтов каждого фрагмента. Фрагменты записываются в субфайл в произвольном порядке. Каждый фрагмент имеет собственное смещение и не зависит от других фрагментов в субфайле. Смещения в этом теге указываются в направлении слева направо и сверху вниз. Если данные изображения разделены на плоскости, то вначале записываются все смещения для первой плоскости, затем все смещения для второй и т.д. Количество смещений в этом теге равно количеству фрагментов изображения (PIanarConnguration = 1) или количеству фрагментов, умноженному на значение тега SamplesPerPixel (PIanarConnguration = 2). Смещения всегда указываются от начала файла TIFF.

Последний тег - TileByteCounts - содержит данные о количестве байтов в каждом сжатом фрагменте. Количество значений этого тега также равно количеству фрагментов изображения, причем эти значения упорядочены тем же способом, что и значения тега TileOffsets.

Обычно размер фрагмента выбирается таким, чтобы точно разделить изображение. Изображение шириной 6400 пикселей и длиной 4800 пикселей можно точно разделить на 150 фрагментов шириной 640 пикселей и длиной 320 пикселей. Однако не все изображения имеют размеры, кратные 16. Изображение шириной 2200 пикселей и длиной 2850 пикселей нельзя точно разделить на фрагменты, размеры которых будут кратными 16. В этом случае решением может стать выбор рациональных размеров фрагмента и дополнение изображения.

Под рациональными понимаются такие размеры фрагмента, при которых размер изображения будет перекрываться минимально. При указанном выше размере изображения можно применить разбиение на фрагменты шириной 256 пикселей и длиной 320 пикселей, т.е. сохранить почти то же соотношение ширины и высоты, что и у исходного изображения. Разбиение на фрагменты таких размеров потребует применения по 104 дополнительных пикселя набивки в каждой строке и 30 дополнительных строк. Размер данных изображения с учетом набивки теперь составит 2304 пикселя в ширину и 2880 пикселей в длину, что позволит точно разделить это изображение на 81 фрагмент размером 256 х 320 пикселей.

Цвета изображения. Спецификация TIFF предлагает концепцию основных типов изображений: двухуровневое, полутоновое, цветное с палитрой и полноцветное. Для каждого основного типа изображений установлен обязательный минимальный объем тегов.

TIFF поддерживает два способа хранения цветовых данных. TIFF-P подобен GIF и использует цветовую палитру (карту) для изображения. Тогда сами данные об изображении хранятся как коды в соответствии iветовой картой. Этот метод обеспечивает эффективность хранения, но ограничивает палитру 256 цветами. Цветовая карта создает свои элементы из 48-битовой палитры (основная структурная единица TIFF - 2-байтовое слово, следовательно, по 16 цветов предоставлено каждой из цветовых плоскостей аддитивной цветовой модели RGB: красной, зеленой и синей). TIFF-R используется для определения полных RGB-изображений. Элемент растра представляется тремя 8-битовы