![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
По-порядку: пишу 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
|
||||
|
||||
|
Цитата:
Цитата:
Вообще, Цитата:
|
|
#3
|
||||
|
||||
|
|
|
#4
|
|||
|
|||
|
А в чем суть упражнения?
Написать свой компрессор? Дык он будет не совместим со стандартным. Получить компрессированный GIF? Дык бери GifImage (кстати, с какой-то версии, типа 2010 и позднее, он идет в поставке) и не мучайся. ЗЫ. Получается больше, т.к. битмап ты испольщуешь скорее всего 24-битный, а GIF изначально 8-битный, но с палитрой. Можно создать по GIF'у соотв. битмап, скопировать палитру. Тогда размеры несжатых картинок бубут примерно одинаковыми, ну а жатый gif будет меньше. |
|
#5
|
|||
|
|||
|
Вопрос решен: для GIf-а бессмысленно делать архиватор, т.к. это уже сам по себе сжатый формат
|