следующий фpагмент (2)- Algorithms.. (2:5030/84) ------------------------------------ RU.ALGORITHMS -
Msg : 4721 of 4728
From : Valery Datsjuk 2:5005/5.28 13 Nov 97 23:04:12
To : Kostya Andreev 15 Nov 97 06:05:27
Subj : Сжатие графики, что новенького?
-------------------------------------------------------------------------------
Привет Kostya!
В Понедельник 10 Hоября 1997, Kostya Andreev прислал письмо для All:
KA> Уважаеmые, вот k ваm созpел очеpедной вопpос:
KA> есть kаkие-нибудь новые алгоpитmы для сжатия гpафиkи? Что-нибудь
KA> ну очень быстpое mожете поpеkоmендовать? И mеста где исkать
KA> пожалуйста.
для сжатия или распаковки? Это принципиально, а пока для затравки двоичное или
квадратичное деление. Сжатие основано на том что в нужной картинке много
больших пятен одинакового или близкого цвета (например шум телевизора на экране
в отсутствии передачи и телевизора нового поколения :) не сжимается и не несет
полезной инфы, высокочастотных деталей много и все без толку).
прямоугольник с изображением обрабатывается по следующему алгоритму:
// двоичное кодирование без потерь медленно сворачивать быстро размораживать
main()
{
текущий_прямоугольник=картинка(Xmin,Ymin,Xmax,Ymax);
кодируем(текущий_прямоугольник,корень,0);
пихаем_дерево_на_винт;
}
кодируем(x1,y1,x2,y2,ориентация_разбиения |-, уровень_вложенности)
{
цвет_пятна=цвет_самой_левой_верхней_точки_текущего_прямоугольника;
цвет = тотже;
while ( цвет == тотже ) AND ( y <= y2 )
{
while ( цвет == тотже ) AND ( x <= x2 )
{
if цвет_пятна != цвет_точки(x,y) цвет = другой;
x++;
}
y++;
}
if (цвет == другой)
{
if (|- == "|") OR (|- == корень)
{
|- = "-";
кодируем(x1,y1,x2,y2/2,|-,уровень+1); // бьем по горизонтали
кодируем(x1,y2/2+1,x2,y2,|-,уровень+1); // нижняя половина
}
if (|- == "-")
{
|- = "|";
кодируем(x1,y1,x2/2,y2,|-,уровень+1); // бьем по вертикали
кодируем(x2/2+1,y1,x2,y2,|-,уровень+1); // правая половина
}
}
else строим_дерево(уровень,|-,цвет_пятна);
}
строим_дерево - сделаЙ_сам! (магазин умелые руки)
С наилучшими пожеланиями, Well.