Вверх ↑
Этот топик читают: Гость
Ответов: 95
Рейтинг: 2
#1: 2013-01-29 16:34:00 ЛС | профиль | цитата
задача: сохранить несколько картинок в один файл со сжатием.
сначала планировал через BitmapArray, но он сохраняет без сжатия.
попробовал через BitmapStream. то же самое
Мой воспаленный мозг может наверно ещё кучу безрезультатных вариантов придумать. Но может кто подскажет быстрое-простое решение для экономии времени?
Пока мысли двигаются в следующих направлениях:
1. создавать временный файл либо через BitmapArray, либо через BitmapStream, затем применить какой-нибудь вариант компрессии.
2. через элемент Jpeg-doLoadFromBitmap конвертировать имеющиеся картинки в jpg и потом собирать в один файл. Вот только не пойму, куда элемент Jpeg выдаёт результат по doLoadFromBitmap?
3. ...

------------ Дoбавленo в 16.34:
неудачный пример с BitmapStream
Add(MainForm,824441,147,77)
{
Width=258
Height=215
Caption="Пример использования компонента Image"
}
Add(Image,15505491,252,63)
{
Left=10
Top=10
Width=105
Height=105
ViewStyle=5
Picture=[ZIP8600000078DA73F26D6380003320D600625628666490008B07306003FF5111857C00CF771ACE]
}
Add(Button,954460,140,175)
{
Left=60
Top=135
Width=105
Height=30
Caption="сохранить"
link(onClick,15291613:doEvent1,[])
}
Add(BitmapStream,6388194,245,175)
{
link(Stream,7236782:Var1,[(251,159)])
link(Bitmap,15505491:ImageBitmap,[])
}
Add(BitmapStream,6445429,308,182)
{
link(Stream,7236782:Var3,[(314,159)])
link(Bitmap,12095515:ImageBitmap,[])
}
Add(FileStream,9359352,280,112)
{
FileName="1.dat"
Mode=1
}
Add(Hub,15291613,189,175)
{
OutCount=4
link(onEvent1,9359352:doOpen,[(216,181)(216,118)])
link(onEvent2,6388194:doWrite,[])
link(onEvent3,6445429:doWrite,[])
link(onEvent4,9359352:doClose,[(228,202)(228,125)])
}
Add(GetDataEx,7236782,280,154)
{
link(Data,9359352:Stream,[])
}
Add(Image,12095515,315,63)
{
Left=10
Top=10
Width=105
Height=105
ViewStyle=5
Picture=[ZIP8600000078DA73F26D6380003320D600625628666490008B07306003FF5111857C00CF771ACE]
}
карма: 0

0
Ответов: 1536
Рейтинг: 176
#2: 2013-01-29 16:58:15 ЛС | профиль | цитата
Abracadabra,
Add(MainForm,824441,210,91)
{
Width=451
Height=342
Caption="Пример использования компонента Image"
}
Add(Image,15505491,798,140)
{
Left=145
Top=10
Width=285
Height=285
ViewStyle=5
Picture=[ZIP8600000078DA73F26D6380003320D600625628666490008B07306003FF5111857C00CF771ACE]
}
Add(ZLIB,7897627,385,161)
{
@Hint=#14:Сжимаем данные|
link(onStream,4210700:doEvent1,[])
link(Stream,10602612:Var3,[(391,138)])
AddHint(-89,47,105,13,@Hint)
}
Add(StreamArray,5326157,469,84)
{
@Hint=#22:Сохраняй сжатые данные|
Streams=[]
UseName=1
AddHint(16,13,146,13,@Hint)
}
Add(ArrayRW,15542493,644,147)
{
link(onRead,15586047:doWork2,[])
link(Array,5326157:Array,[(650,125)(475,125)])
}
Add(Img_Loader,9522317,259,147)
{
link(onLoad,13586787:doEvent1,[])
}
Add(ZLIB,10160245,700,140)
{
@Hint=#16:Разжимаем данные|
link(onStream,10290554:doRead,[])
AddHint(-24,51,117,13,@Hint)
}
Add(ListBox,7648064,581,217)
{
Left=10
Top=10
Width=125
Height=285
link(onClick,15542493:doRead,[(628,230)(628,153)])
}
Add(For,12653960,525,182)
{
link(onEvent,7648064:doAdd,[(573,188)(573,223)])
link(End,7548004:Result,[(538,170)(510,170)(510,226)(482,226)])
}
Add(Hub,4210700,427,161)
{
OutCount=4
link(onEvent1,15542493:doAdd,[])
link(onEvent2,15586047:doWork3,[(683,174)])
link(onEvent3,7648064:doClear,[(461,181)(461,230)])
link(onEvent4,7548004:doOperation,[])
}
Add(Math,7548004,476,182)
{
OpType=1
Op2=1
ResultType=0
link(onResult,12653960:doFor,[])
link(Op1,5326157:Count,[])
}
Add(DropFile,200503,210,147)
{
link(onDropFile,9522317:doLoad,[])
}
Add(BitmapStream,7215676,336,147)
{
link(Stream,10602612:Var2,[])
}
Add(MemoryStream,10830458,336,91)
{
}
Add(Hub,13586787,301,147)
{
OutCount=3
link(onEvent1,10830458:doClear,[(325,153)(325,104)])
link(onEvent2,7215676:doWrite,[])
link(onEvent3,7897627:doCompress,[])
}
Add(GetDataEx,10602612,336,133)
{
link(Data,10830458:Stream,[])
}
Add(BitmapStream,10290554,749,140)
{
link(onRead,15505491:doLoad,[])
}
Add(HubEx,15586047,679,147)
{
link(onEvent,10160245:doDeCompress,[])
}

карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Гость
Ответов: 17029
Рейтинг: 0
#3: 2013-01-29 21:29:18 правка | ЛС | профиль | цитата
ser_davkin, уберите MathParse, не путайте новичков, есть же у For свойство IncludeEnd.
карма: 0

0
Ответов: 1536
Рейтинг: 176
#4: 2013-01-29 23:12:07 ЛС | профиль | цитата
37.45.71.201 писал(а):
уберите MathParse, не путайте новичков
Да, действительно лишнее. IncludeEnd у For странно работает, поэтому я им не пользуюсь. Исправил.
карма: 1
Не так страшна ошибка, как опасность её не заметить.

0
Ответов: 9906
Рейтинг: 351
#5: 2013-01-29 23:14:19 ЛС | профиль | цитата
ser_davkin писал(а):
IncludeEnd у For странно работает

Ась
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#6: 2013-01-29 23:23:47 правка | ЛС | профиль | цитата
ser_davkin писал(а):
IncludeEnd у For странно работает, поэтому я им не пользуюсь.
С этого места поподробней и желательно схемой.
карма: 0

0
Ответов: 95
Рейтинг: 2
#7: 2013-01-30 10:25:36 ЛС | профиль | цитата
ser_davkin, спасибо за схему, идея ясна.
и всё-таки помогите разобраться с элемент Jpeg-doLoadFromBitmap. на какую точку выдаётся результат?
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#8: 2013-01-30 10:39:19 ЛС | профиль | цитата
Abracadabra писал(а):
на какую точку выдаётся результат

Никуда не выдается. Картинка bmp преобразуется а jpg и остается в памяти. После чего можно использовать doSaveToStream и записать картинку в MemoryStream, а дальше уже куда угодно, хоть в файл, хоть в массив стримов
карма: 22

0
Ответов: 95
Рейтинг: 2
#9: 2013-01-30 10:54:07 ЛС | профиль | цитата
nesco писал(а):
После чего можно использовать doSaveToStream и записать картинку в MemoryStream
Спасибо за ответ.
Набросал вот такую схемку.
Add(MainForm,824441,147,224)
{
Width=495
Height=347
Caption="Пример использования компонента Image"
Position=1
}
Add(Jpeg,3829760,420,280)
{
Quality=100
Point(doLoadFromBitmap)
Point(Stream)
Point(doSaveToStream)
link(Stream,2793314:Var2,[])
}
Add(MemoryStream,14180989,420,224)
{
}
Add(ODialog,7723129,259,224)
{
link(onExecute,2018766:doLoad,[])
}
Add(Button,6487798,210,224)
{
Left=10
Top=10
Caption="загр"
link(onClick,7723129:doExecute,[])
}
Add(FileStream,9587278,525,294)
{
FileName="1.jpg"
Mode=2
AutoCopy=0
Point(doCopyFromStream)
}
Add(Hub,10417562,322,294)
{
OutCount=3
link(onEvent1,4150899:doData,[(346,300)(346,279)])
link(onEvent2,3829760:doSaveToStream,[])
link(onEvent3,2069389:doData,[])
}
Add(DoData,2069389,469,308)
{
link(onEventData,9587278:doCopyFromStream,[])
link(Data,2793314:Var3,[(475,264)])
}
Add(Image,1145899,357,224)
{
Left=80
Top=10
Width=400
Height=300
}
Add(Img_Loader,2018766,308,224)
{
link(onLoad,1145899:doLoad,[])
}
Add(Button,3461710,273,294)
{
Left=10
Top=45
Caption="сохр"
link(onClick,10417562:doEvent1,[])
}
Add(DoData,4150899,357,273)
{
link(onEventData,3829760:doLoadFromBitmap,[(405,279)(405,300)])
link(Data,1145899:ImageBitmap,[])
}
Add(GetDataEx,2793314,420,259)
{
link(Data,14180989:Stream,[])
}
загружаю какую-нибудь jpg-картинку. получаемый в результате jpg-файл примерно в два раза больше (в байтах) оригинала. Почему так?
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2013-01-30 11:09:20 ЛС | профиль | цитата
Abracadabra писал(а):
Почему так?

Потому, что Qualite=100, а в орининале явно не 100
карма: 22

0
Ответов: 95
Рейтинг: 2
#11: 2013-01-30 12:01:13 ЛС | профиль | цитата
nesco, спасибо за разъяснения. Посмотрите пожалуйста, я правильно компонент собрал?
code_30219.txt
карма: 0

0
файлы: 1code_30219.txt [1.5KB] [39]
Разработчик
Ответов: 26163
Рейтинг: 2127
#12: 2013-01-30 12:09:59 ЛС | профиль | цитата
Abracadabra писал(а):
я правильно компонент собрал?

Я бы еще возврат Position на ноль в MemeoryStream бы добавил по окончанию записи перед выдачей в поток. Но для полноценного компонента нужен еще компонент Version, в обучающем видео это все показано. А пока это все еще контейнер.
карма: 22

0
Ответов: 95
Рейтинг: 2
#13: 2013-01-30 12:22:37 ЛС | профиль | цитата
блин, с одной заморочкой разбираюсь, новые появляются.
Компонент DoData внутри контейнера выкидывает картинку, если её подать на вход, а не сверху. Это печально. Хотелось собрать компонент, который бы воспринимал входящую картинку как сверху, так и с входа по правилам приоритета.
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#14: 2013-01-30 12:51:54 ЛС | профиль | цитата
Abracadabra писал(а):
Компонент DoData внутри контейнера выкидывает картинку

Компонент DoData вообще отделяет поток, вне зависимости от его расположения
------------ Дoбавленo в 12.39:
Abracadabra писал(а):
так и с входа по правилам приоритета

Для контейнера это просто так не получится
------------ Дoбавленo в 12.51:
Вот так можно попробовать выкрутиться

Add(MultiElementEx,9901676,238,126)
{
}
BEGIN_SDK
Add(EditMultiEx,285396,21,21)
{
WorkCount=#50:doBmpToJpg=Преобразует bmp (stream) в jpg (stream)|
EventCount=#44:onBmpToJpg=выдаёт в поток jpg-картинку (bin)|
VarCount=#38:Jpg-Stream=содержит jpg-картинку (bin)|
DataCount=#20:Picture=картинка bmp|32:Quality=Качество сжатия картинки|
Width=405
Height=179
VOffset=21
link(doBmpToJpg,2766042:doEvent1,[])
link(Jpg-Stream,4566325:Var2,[(27,152)(307,152)])
}
Add(Jpeg,1386999,329,98)
{
Quality=80
Point(doLoadFromBitmap)
Point(Stream)
Point(doSaveToStream)
Point(Quality)
MakeExt(Quality,Качество сжатия картинки,Quality)
link(Stream,4566325:Var3,[(335,89)])
link(Quality,285396:Quality,[(342,24)(34,24)])
}
Add(MemoryStream,12446609,301,35)
{
Point(doPosition)
}
Add(DoData,11548064,364,154)
{
link(onEventData,285396:onBmpToJpg,[(404,160)(404,48)])
link(Data,4027200:Var3,[(370,75)])
}
Add(Hub,2766042,35,42)
{
OutCount=5
link(onEvent1,12446609:doClear,[])
link(onEvent2,2146531:doValue,[(66,55)(66,111)])
link(onEvent3,1386999:doSaveToStream,[(295,62)(295,125)])
link(onEvent4,5945870:doData,[])
link(onEvent5,11548064:doData,[(59,76)(59,160)])
}
Add(GetDataEx,4566325,301,84)
{
link(Data,4027200:Var2,[])
}
Add(GetDataEx,4027200,301,70)
{
link(Data,12446609:Stream,[])
}
Add(DoData,5945870,189,63)
{
Data=Integer(0)
link(onEventData,12446609:doPosition,[(261,69)(261,55)])
}
Add(Case,7353902,189,105)
{
link(onNextCase,939769:doWork1,[(284,111)])
link(onTrue,15745553:doData,[])
}
Add(DoData,10661553,140,105)
{
link(onEventData,7353902:doCase,[])
link(Data,285396:Picture,[(146,36)(27,36)])
}
Add(Memory,2146531,91,105)
{
link(onData,10661553:doData,[])
}
Add(DoData,15745553,238,112)
{
link(onEventData,939769:doWork2,[])
link(Data,2146531:Value,[(244,100)(174,100)(174,149)(97,149)])
}
Add(HubEx,939769,280,112)
{
link(onEvent,1386999:doLoadFromBitmap,[])
}
END_SDK


карма: 22

0
Ответов: 9906
Рейтинг: 351
#15: 2013-01-30 13:30:28 ЛС | профиль | цитата
А если НЕ выкручиваться, а тупо выкинуть кое чего

Add(MultiElementEx,9901676,392,196)
{
}
BEGIN_SDK
Add(EditMultiEx,285396,21,21)
{
WorkCount=#50:doBmpToJpg=Преобразует bmp (stream) в jpg (stream)|
EventCount=#44:onBmpToJpg=выдаёт в поток jpg-картинку (bin)|
VarCount=#38:Jpg-Stream=содержит jpg-картинку (bin)|
DataCount=#20:Picture=картинка bmp|32:Quality=Качество сжатия картинки|
Width=405
Height=179
VOffset=21
link(doBmpToJpg,2766042:doEvent1,[])
link(Jpg-Stream,16182303:Var1,[(27,106)])
}
Add(Jpeg,1386999,231,140)
{
Quality=80
Point(doLoadFromBitmap)
Point(Stream)
Point(doSaveToStream)
Point(Quality)
MakeExt(Quality,Качество сжатия картинки,Quality)
link(Stream,3137570:Var2,[])
link(Quality,285396:Quality,[(244,24)(34,24)])
}
Add(MemoryStream,12446609,231,35)
{
Point(doPosition)
}
Add(DoData,11548064,84,119)
{
link(onEventData,285396:onBmpToJpg,[(271,125)(271,48)])
link(Data,16182303:Var2,[])
}
Add(Hub,2766042,35,42)
{
OutCount=5
link(onEvent1,12446609:doClear,[])
link(onEvent2,2146531:doValue,[])
link(onEvent3,1386999:doSaveToStream,[(60,62)(60,167)])
link(onEvent4,5945870:doData,[])
link(onEvent5,11548064:doData,[(68,76)(68,125)])
}
Add(DoData,5945870,84,63)
{
Data=Integer(0)
link(onEventData,12446609:doPosition,[(189,69)(189,55)])
}
Add(Memory,2146531,133,49)
{
Point(Data)
link(onData,1386999:doLoadFromBitmap,[(180,55)(180,160)])
link(Data,285396:Picture,[(139,32)(27,32)])
}
Add(GetDataEx,3137570,231,101)
{
link(Data,12446609:Stream,[])
}
Add(GetDataEx,16182303,84,101)
{
Angle=1
link(Data,3137570:Var1,[])
}
END_SDK

Не проверял... Но если мне не изменяет мой склероз - должно БЫ работать
карма: 9

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