Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.06.2016, 22:53
Linerath Linerath вне форума
Прохожий
 
Регистрация: 09.06.2016
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию 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  
Старый 10.06.2016, 08:19
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Дело в том, что до сжатия дело не дошло, а уже куча проблем.


Цитата:
Проблема: со сканлайном можно работать только через bitmap, следовательно все преобразования будут на bitmap'е.
Можно и без битмапа и без скайнлайна. Посмотри формат файла.

Вообще,

Цитата:
Были некоторые другие варианты архивации (открыть его как файл, а не изображение, но устройство gif не позволило мне этого сделать).
Ты что-то делаешь не так.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 10.06.2016, 14:15
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

http://compression.ru/download/lz.html
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 11.06.2016, 19:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,052
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А в чем суть упражнения?
Написать свой компрессор? Дык он будет не совместим со стандартным.
Получить компрессированный GIF? Дык бери GifImage (кстати, с какой-то версии, типа 2010 и позднее, он идет в поставке) и не мучайся.

ЗЫ. Получается больше, т.к. битмап ты испольщуешь скорее всего 24-битный, а GIF изначально 8-битный, но с палитрой. Можно создать по GIF'у соотв. битмап, скопировать палитру. Тогда размеры несжатых картинок бубут примерно одинаковыми, ну а жатый gif будет меньше.
Ответить с цитированием
  #5  
Старый 12.06.2016, 10:57
Linerath Linerath вне форума
Прохожий
 
Регистрация: 09.06.2016
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вопрос решен: для GIf-а бессмысленно делать архиватор, т.к. это уже сам по себе сжатый формат
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter