|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
LZW для Gif на Delphi 7
По-порядку: пишу LZW-архиватор (с позволения сказать). Дело в том, что до сжатия дело не дошло, а уже куча проблем. Действую по след. принципу: ScanLine'ом иду по исходному изображению, произвожу все необходимые LZW преобразования, потом, при распаковке, создаю новый gif файл, ScanLine'ом иду по нему и изменяю каждый пиксель в соответствии с полученными из сжатия данными. Проблема: со сканлайном можно работать только через bitmap, следовательно все преобразования будут на bitmap'е. Из этого вытекает то, что при вот этом формировании новой gif картинки сохраняться будет фактически bmp-файл и его размер намного больше исходной картинки.
Были некоторые другие варианты архивации (открыть его как файл, а не изображение, но устройство gif не позволило мне этого сделать). Как вообще можно реализовать LZW на Delphi? Прошу ткнуть носом, ибо я уже много дней сижу на одном и том же месте. Вот, как я создаю новый (фактически, перезаписываю, но это пока) gif: Код:
var GIF: TGIFImage; i, j: Integer; PScanLineArray: PByteArray; f_code: textFile; b: byte; begin AssignFile(f_code,'output.txt'); //файл с цветами пикселей Reset(f_code); GIF:=TGIFImage.Create; try GIF.LoadFromFile('white.gif'); //перезаписываю белый gif-файл GIF.Bitmap.PixelFormat:=pf8bit; for i:=0 to GIF.Bitmap.Height-1 do begin PScanLineArray:=GIF.Bitmap.ScanLine[i]; for j:=0 to GIF.Bitmap.Width-1 do begin read(f_code,b); PScanLineArray[j]:=b; end; end; finally begin GIF.Bitmap.SaveToFile('D:\LZW_files\Pictures\try.gif'); GIF.Free; end; end; CloseFile(f_code); |
#2
|
||||
|
||||
Цитата:
Цитата:
Вообще, Цитата:
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
|||
|
|||
А в чем суть упражнения?
Написать свой компрессор? Дык он будет не совместим со стандартным. Получить компрессированный GIF? Дык бери GifImage (кстати, с какой-то версии, типа 2010 и позднее, он идет в поставке) и не мучайся. ЗЫ. Получается больше, т.к. битмап ты испольщуешь скорее всего 24-битный, а GIF изначально 8-битный, но с палитрой. Можно создать по GIF'у соотв. битмап, скопировать палитру. Тогда размеры несжатых картинок бубут примерно одинаковыми, ну а жатый gif будет меньше. |
#5
|
|||
|
|||
Вопрос решен: для GIf-а бессмысленно делать архиватор, т.к. это уже сам по себе сжатый формат
|