Вверх ↑
Этот топик читают: Гость
Ответов: 4612
Рейтинг: 746
#1: 2016-02-06 13:32:46 ЛС | профиль | цитата
GZIP v1.1

Компонент позволяет сжимать/распаковывать строки, потоки и файлы в формате GZIP.

Инструкция по установке - в архиве

Компонент создан по заказу пользователя Gunnman

СКАЧАТЬ

Редактировалось 5 раз(а), последний 2019-03-06 12:47:10
карма: 26

4
Голосовали:Nickname, Konst, MAV, Ales
vip
#1.1контекстная реклама от партнеров
Ответов: 4612
Рейтинг: 746
#2: 2016-02-07 15:54:37 ЛС | профиль | цитата
Если кому-то интересно, в архиве модифицированный файл KolZLib.pas для работы стандартного компилятора FPC через официальную zlib.dll (а не ту, что лежит в папке HiAsm). Это позволяет использовать один и тот же код на всех компиляторах (для FPC - нужна zlib.dll). Как пример, там же поправленный hiZLIB.pas (выброшен код, специфичный для FPC) и демо схема из справки по компоненту ZLIB, показывающие работу компонента ZLIB.
Таким образом, если компонент PNG не работал на FPC только по причине KolZLib.pas, то, думаю, его можно легко поправить.
Компонент GZIP в этом случае вообще не требует никакой доработки для работы с FPC.

Редактировалось 1 раз(а), последний 2016-11-03 14:57:19
карма: 26

1
Голосовали:Konst
Ответов: 2
Рейтинг: 0
#3: 2016-11-03 14:01:24 ЛС | профиль | цитата
Доброго времени суток, заранее извиняюсь за поднятие старой темы, но вынудила необходимость компресси в gzip, отсюда и просьба, возможно ли перезалить архивчик, поскольку по ссылке он более не доступен. Заранее спасибо
карма: 0

0
Ответов: 4612
Рейтинг: 746
#4: 2016-11-03 14:55:58 ЛС | профиль | цитата
Сделано.
карма: 26

0
Ответов: 2
Рейтинг: 0
#5: 2016-11-03 18:46:09 ЛС | профиль | цитата
Еще раз большое спасибо.
карма: 0

0
Ответов: 655
Рейтинг: 18
#6: 2017-04-14 21:17:00 ЛС | профиль | цитата
Netspirit, столкнулся с проблемой: одни строки жмет\разжимает нормально другие нет.


Вот схема:
Add(GZIP,6465752,167,126)
{
Level=9
link(onResult,9354990:doDecompress,[])
}
Add(GZIP,9354990,238,119)
{
Level=9
link(onResult,4465068:doMessage,[])
}
Add(Message,4465068,299,119)
{
}
Add(StrList,14138808,107,27)
{
@Hint=#14:Не работает :(|
Strings=#10:фывфывфывф|11:12213123123|11:ававававава|12:546557567657|5:2aaaa|
AddHint(56,27,87,13,@Hint)
}
Add(StrList,8238795,282,41)
{
@Hint=#9:Работает!|
Strings=#10:фывфывфывф|11:12213123123|11:ававававава|
AddHint(68,16,65,13,@Hint)
}
Add(Delete,14736134,107,126)
{
Count=2
Direction=1
link(onDelete,6465752:doCompress,[])
link(Str,14138808:Text,[])
}
Add(Button,9960682,63,126)
{
Left=60
Top=125
link(onClick,14736134:doDelete,[])
}


Редактировалось 6 раз(а), последний 2017-04-14 22:15:43
карма: 0

0
Ответов: 4612
Рейтинг: 746
#7: 2017-04-18 14:45:21 ЛС | профиль | цитата
Поправил. Пробуй.
карма: 26

0
Ответов: 655
Рейтинг: 18
#8: 2017-04-20 14:32:40 ЛС | профиль | цитата
Netspirit, пока полет нормальный! Спасибо! В чем проблема-то была?
карма: 0

0
Ответов: 4612
Рейтинг: 746
#9: 2017-04-20 15:46:47 ЛС | профиль | цитата
В процедуре распаковки не был учтен один пограничный случай (ZLib вместо кода операции Z_STREAM_END иногда при успешной распаковке выдаёт Z_OK).
карма: 26

0
Ответов: 632
Рейтинг: 4
#10: 2017-12-05 19:03:06 ЛС | профиль | цитата
Рассчитывал, что этот компонент будет лучше ZLIB. Оказалось хуже...


--- Добавлено в 2017-12-05 19:07:46

Что бы улучшать на один уровень или выше компонента ZLIB. Надо узнать секрет успеха, его алгоритма.

Редактировалось 1 раз(а), последний 2017-12-05 19:07:46
карма: 0

0
Ответов: 4612
Рейтинг: 746
#11: 2017-12-06 11:54:22 ЛС | профиль | цитата
Схему давай.

Редактировалось 1 раз(а), последний 2017-12-06 11:57:04
карма: 26

0
Ответов: 632
Рейтинг: 4
#12: 2017-12-07 00:12:07 ЛС | профиль | цитата

Make(delphi)
ver(4.05 build 186)
Add(MainForm,2953706,21,105)
{
Width=559
Height=351
Position=1
}
Add(GZIP,6465752,398,392)
{
Level=9
Point(doLevel)
link(onResult,8650677:doEvent1,[])
}
Add(GZIP,9354990,567,385)
{
Level=9
Point(doLevel)
link(onResult,16704900:doConvert,[(611,391)(611,356)(569,356)(569,321)])
}
Add(Button,9960682,84,252)
{
Left=35
Top=240
link(onClick,7282259:doEvent1,[])
}
Add(ScreenShort,11713096,140,357)
{
link(onCapture,11035933:doDraw,[])
}
Add(Img_Bmp,11035933,182,357)
{
Transparent=0
TransparentColor=16711935
Point(X)
Point(Y)
link(onDraw,2064534:doEvent1,[(222,363)(222,349)])
link(SourceBitmap,9245208:Bitmap,[])
link(X,9245208:CursorX,[])
link(Y,9245208:CursorY,[])
}
Add(Cursor,9245208,189,308)
{
BkColor=16711935
Point(CursorX)
Point(CursorY)
link(onGet,11713096:doCapture,[(276,314)(276,403)(128,403)(128,363)])
}
Add(MemoryStream,13675339,266,308)
{
}
Add(Hub,2064534,231,343)
{
OutCount=4
link(onEvent1,15745117:doWrite,[(255,349)(255,391)])
link(onEvent2,14330567:doData,[(283,356)(283,398)])
link(onEvent3,13675339:doClear,[(255,363)(255,321)])
link(onEvent4,13675339:doCopy,[(255,370)(255,314)])
}
Add(BitmapStream,15745117,266,378)
{
link(Stream,6842609:Var2,[])
}
Add(DoData,14330567,322,392)
{
link(onEventData,4503612:doEvent1,[(366,398)(366,388)(338,388)(338,377)])
link(Data,6842609:Var3,[(328,362)])
}
Add(GetDataEx,6842609,266,357)
{
link(Data,13675339:Stream,[])
}
Add(Hub,8650677,476,392)
{
OutCount=3
link(onEvent1,7292992:doStop,[(502,398)(502,412)(450,412)(450,447)])
link(onEvent2,7399829:doConvert,[(502,405)(502,373)(436,373)(436,342)])
link(onEvent3,9354990:doDecompress,[(528,412)(528,398)])
}
Add(MemoryStream,3940958,511,343)
{
link(onCopy,15667712:doString,[(555,349)(555,419)(373,419)(373,475)])
}
Add(Image,10930049,651,350)
{
Left=305
Top=90
Width=215
Height=165
}
Add(Hub,4139090,623,378)
{
link(onEvent1,10930049:doClear,[(644,384)(644,363)])
link(onEvent2,10930049:doLoad,[(644,391)(644,356)])
}
Add(BitmapStream,15245329,644,301)
{
link(onRead,4139090:doEvent1,[(688,307)(688,345)(611,345)(611,384)])
}
Add(StreamConvertor,16704900,581,315)
{
Mode=7
link(onResult,15245329:doRead,[(629,321)(629,307)])
}
Add(StreamConvertor,7399829,448,336)
{
Mode=7
link(onResult,3940958:doCopy,[(496,342)(496,349)])
}
Add(StreamConvertor,1531933,357,336)
{
Mode=6
link(onResult,6465752:doCompress,[(393,342)(393,398)])
}
Add(ZLIB,16375622,371,511)
{
link(onStream,9884492:doEvent1,[])
}
Add(Hub,10973996,343,441)
{
link(onEvent1,6465752:doLevel,[(362,447)(362,426)])
link(onEvent2,9354990:doLevel,[(462,454)(462,419)])
}
Add(Hub,4503612,350,371)
{
OutCount=4
link(onEvent1,1531933:doConvert,[(376,377)(376,359)(345,359)(345,342)])
link(onEvent2,7292992:doStart,[(413,384)(413,440)])
link(onEvent3,6624894:doStart,[(420,391)(420,559)])
link(onEvent4,16375622:doCompress,[(368,398)(368,517)])
}
Add(ListBox,8293266,196,476)
{
Left=5
Top=35
Width=285
Height=185
}
Add(Hub,7282259,133,252)
{
link(onEvent1,8293266:doClear,[(171,258)(171,489)])
link(onEvent2,9245208:doGet,[(168,265)(168,314)])
}
Add(Hub,10585727,147,476)
{
InCount=2
OutCount=1
link(onEvent1,8293266:doAdd,[])
}
Add(Hub,9884492,441,511)
{
link(onEvent1,6624894:doStop,[(465,517)(465,566)])
link(onEvent2,12610744:doCopy,[(473,524)(473,496)])
}
Add(MemoryStream,12610744,490,490)
{
link(onCopy,16665032:doString,[(534,496)(534,538)(380,538)(380,580)])
}
Add(GetDataEx,2709286,273,343)
{
link(Data,13675339:Size,[])
}
Add(FormatStr,15667712,399,469)
{
DataCount=3
Mask="ДО:%1 ПОСЛЕ:%2 GZIP В:%3 милсек"
link(onFString,10585727:doEvent1,[(447,475)(447,478)(135,478)(135,482)])
link(Str1,2709286:Var2,[(405,417)(279,417)])
link(Str2,3940958:Size,[(412,429)(524,429)])
link(Str3,6282022:Value,[(419,467)(538,467)])
}
Add(FormatStr,16665032,392,574)
{
DataCount=3
Mask="ДО:%1 ПОСЛЕ:%2 ZLIB В:%3 милсек"
link(onFString,10585727:doEvent2,[(436,580)(436,534)(135,534)(135,489)])
link(Str1,2709286:Var3,[(398,348)])
link(Str2,12610744:Size,[(405,548)(503,548)])
link(Str3,8009142:Value,[(412,572)(545,572)])
}
Add(TimeCounter,7292992,483,434)
{
link(onStop,6282022:doValue,[(523,447)(523,440)])
}
Add(TimeCounter,6624894,476,553)
{
link(onStop,8009142:doValue,[(524,566)(524,545)])
}
Add(Memory,6282022,532,434)
{
}
Add(Memory,8009142,539,539)
{
}
Add(TrackBar,1930854,294,441)
{
Left=15
Top=270
Width=495
Max=9
Position=9
link(onPosition,10973996:doEvent1,[])
}

карма: 0

0
Ответов: 4612
Рейтинг: 746
#13: 2017-12-07 11:49:30 ЛС | профиль | цитата
Схема слишком муторная. Потеря скорости происходит при конвертации StreamToStr для подачи на GZIP, тогда как у него есть отдельный метод doCompressStream. А у ZLIB - нету метода для сжатия строк, поэтому "улучшать на один уровень или выше компонента ZLIB" не канает - компонент ZLIB на "один уровень" (или больше) ниже, чем мой GZIP.

Вот корректная схема теста быстродействия:



Add(MainForm,2953706,21,105)
{
Height=268
Caption="Тест компрессии"
Position=1
}
Add(TimeCounter,11491838,392,434)
{
link(onStart,14974975:doCompress,[])
link(onStop,11103376:doEvent1,[(432,447)(432,489)])
}
Add(Label,2676694,14,224)
{
Left=5
Top=15
Width=36
Height=17
Caption="Файл:"
}
Add(Memo,4392622,644,322)
{
Left=5
Top=50
Width=375
Height=110
ScrollBars=2
}
Add(Button,9779034,147,644)
{
Left=5
Top=205
Width=125
Caption="Выполнить"
link(onClick,3576136:doEvent1,[])
}
Add(Edit,3169018,322,238)
{
Left=45
Top=10
Width=335
Text="test.txt"
}
Add(LineBreakEx,11296485,322,294)
{
Caption="file"
Type=3
link(_Data,3169018:Text,[])
}
Add(LineBreakEx,12177374,637,483)
{
Caption="add"
}
Add(LineBreakEx,2917070,329,399)
{
Caption="file"
Type=2
}
Add(LineBreakEx,16369636,588,322)
{
Caption="add"
Type=1
link(OnEvent,4392622:doAdd,[])
}
Add(Hub,3576136,224,644)
{
link(onEvent1,12662887:doOpen,[(284,650)(284,440)])
link(onEvent2,11462946:doOpen,[(282,657)(282,783)])
}
Add(ZLIB,14974975,483,434)
{
link(onStream,11491838:doStop,[(546,440)(546,409)(380,409)(380,447)])
}
Add(FileStream,12662887,329,434)
{
link(onLoad,11491838:doStart,[])
link(FileName,2917070:getVar,[])
}
Add(Hub,11103376,483,483)
{
link(onEvent1,9545499:doString,[])
link(onEvent2,12662887:doClose,[(550,496)(550,527)(317,527)(317,447)])
}
Add(FormatStr,9545499,581,483)
{
Mask="ZLIB: %1 ms"
link(onFString,12177374:doWork,[])
}
Add(TimeCounter,14919540,420,777)
{
link(onStart,1922754:doCompressStream,[])
link(onStop,13100280:doEvent1,[(479,790)(479,860)])
}
Add(LineBreakEx,2404323,665,854)
{
Caption="add"
}
Add(LineBreakEx,2362627,357,742)
{
Caption="file"
Type=2
}
Add(FileStream,11462946,357,777)
{
link(onLoad,14919540:doStart,[])
link(FileName,2362627:getVar,[])
}
Add(Hub,13100280,511,854)
{
link(onEvent1,3503577:doString,[])
link(onEvent2,11462946:doClose,[(584,867)(584,909)(345,909)(345,790)])
}
Add(FormatStr,3503577,609,854)
{
Mask="GZIP: %1 ms"
link(onFString,2404323:doWork,[])
}
Add(GZIP,1922754,637,749)
{
Level=9
Point(doCompressStream)
Point(Count)
Point(SrcStream)
Point(DstStream)
Point(doLevel)
link(onResult,3038085:doEvent1,[])
link(Count,11462946:Size,[(664,737)(398,737)(398,824)(370,824)])
link(DstStream,854499:Stream,[])
}
Add(MemoryStream,854499,672,693)
{
}
Add(TrackBar,15295084,574,784)
{
Left=70
Top=165
Width=315
Max=9
Position=9
link(onPosition,1922754:doLevel,[])
}
Add(Label,1173904,14,168)
{
Left=5
Top=170
Width=57
Height=17
Caption="GZIP level:"
}
Add(Hub,3038085,714,749)
{
link(onEvent1,854499:doClear,[(746,755)(746,668)(660,668)(660,706)])
link(onEvent2,14919540:doStop,[(772,762)(772,632)(408,632)(408,790)])
}

Для корректных результатов размер файла должен быть достаточно большим, чтобы компрессия занимала хотя бы 10 секунд. Примерно хватит объёма от 30 Мб. Как и следовало ожидать, быстродействие обоих компонентов одинаковое (на одинаковом уровне компрессии), поскольку используется один и тот же алгоритм.
карма: 26

0
Ответов: 704
Рейтинг: 7
#14: 2019-02-22 16:16:18 ЛС | профиль | цитата
Netspirit, некоторые компоненты от Вас просто палочки-выручалочки. Спасибо!
карма: 0

0
Ответов: 4612
Рейтинг: 746
#15: 2019-02-22 17:18:15 ЛС | профиль | цитата
Пользуйтесь в удовольствие!
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)