Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2008, 18:41   #1
vitality
 
Регистрация: 04.01.2008
Сообщений: 5
По умолчанию распаковка .Jpeg

Я получаю с камеры фотографии .jpeg. Эти фотографии я хочу выводить в цикле-тем самым получить видео поток. Но поскольку я вывожу на битмап то необходимо распаковать jpeg и на это у меня уходит 120 мс. Ту же фотографию я открываю с помощью IrfanView и время на загрузку фото уходит 60 мс. Т.е время тратится в 2 раза меньше. Может кто работал с этим и может подсказать как мне быстрее всего выводить .JPEG на интерфейс программы?
Скажу сразу:
Я делаю это так:
получаю jpeg от IP-камеры в память компьютера,
myJpeg.LoadFromStream(memstream); -это загрузка жпега из памяти в объект типа TJpegImage
a дальше делаю вот так:
Form1.Image1.Picture.Bitmap.Assign( myJpeg); - это присвоение битмапу картинки нашего TJpegImage
то есть по сути вывод
время замерял и получается что на вторую строчку и уходит очень много времени...

Заранее всем спасибо!
vitality вне форума Ответить с цитированием
Старый 05.01.2008, 15:34   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

это
Form1.Image1.Picture.Bitmap.Assign( myJpeg);
можно заменить на это
Form1.Canvas.Draw(0,0,myJpeg);
Возможно будет быстрее.

Дополнительно к этому можно применить буферизацию. По принципу просмотра видео из интернета. Создать к примеру массив TJpegImage нужной длины и предварительно подгружать в него запас картинок.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 05.01.2008, 15:35   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

<please delete this>
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 05.01.2008 в 15:39.
mutabor вне форума Ответить с цитированием
Старый 05.01.2008, 16:32   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если цель выводить видео забудьте про gdi! Путь ведет к DirectX
BOBAH13 вне форума Ответить с цитированием
Старый 05.01.2008, 19:08   #5
vitality
 
Регистрация: 04.01.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Если цель выводить видео забудьте про gdi! Путь ведет к DirectX
как такового видео нет-есть просто поток от камеры в виде фотографий. их камера посылает достаточно быстро 30 мс. а вот сам вывод на экран этих фоток получается очень долго. если же есть идеи с директХ то подскажите. знакомый попробовал найти отличия при выводе жпега с помощью директХ и особой разницы не увидел...
vitality вне форума Ответить с цитированием
Старый 06.01.2008, 09:56   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вы не понимаете. Не стоит сравнивать gdi и DirectX - незнаю что там Ваш знакомый сравнивал и почему такой вывод сделал. В нашем же случае стоит поставить DelphiX ( найти в интернете не проблема ) потом в коде таймера от DelphiX ( статей не мало в DelphiWorld ) просто перебиваете в BitMap из jpeg и выводите на surface DirectDraw Почитайте стоящая тема, + не все так сложно с компонентами.
А почему разница есть - та пример простой: Почему плеера для вывода юзают не gdi32, а DirectX ?
BOBAH13 вне форума Ответить с цитированием
Старый 08.01.2008, 10:50   #7
vitality
 
Регистрация: 04.01.2008
Сообщений: 5
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
просто перебиваете в BitMap из jpeg и выводите на surface DirectDraw
когда я создал тему то и написал как мне перебить jpeg в битмап. пробовал сам использовать directshow-уменьшилось мелькание картинок но скорость осталась преждней. сейчас разбирался с gdi+ и вот какая проблема:
Есть форма. На ней живут кнопка и TImage.
В папке с прогой лежат 200 картинок pic1.jpg - pic200.jpg.
Глобально объявлены переменные
graphics : TGPGraphics;
Image: TGPImage;

Если в обработчик клика на кнопку вставить такой код:
procedure TForm1.Button1Click(Sender: TObject);
begin
graphics := TGPGraphics.Create(image1.Canvas.Ha ndle );

image:=image.FromFile('pic1.jpg');
graphics.DrawImage(image, 1, 1, Image1.Width-1, form1.Image1.Height-1);
end;

то картинка рисуется

если код такой:
procedure TForm1.Button1Click(Sender: TObject);
begin
graphics := TGPGraphics.Create(image1.Canvas.Ha ndle );

image:=image.FromFile('pic1.jpg');
graphics.DrawImage(image, 1, 1, Image1.Width-1, form1.Image1.Height-1);
image1.repaint;
sleep(1000);
image:=image.FromFile('pic2.jpg');
graphics.DrawImage(image, 1, 1, Image1.Width-1, form1.Image1.Height-1);
image1.repaint;
end;

то рисуется сперва картинка 1, потом, через секунду, картинка 2
(при этом если убрать image1.repaint, то вторая картинка не нарисуется)

если же код такой:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
graphics := TGPGraphics.Create(image1.Canvas.Ha ndle );

for i:=1 to 200 do begin
image:=image.FromFile('pic'+inttost r(i)+'.jpg');
graphics.DrawImage(image, 1, 1, Image1.Width-1, form1.Image1.Height-1);
image1.repaint;
application.ProcessMessages;
sleep(1000);
end;
end;

то рисуется только первая картинка, а остальные из цикла - нет.
Подозреваю, что это связано с тем, что gdi+ заточен под работу в чистом WinAPI и где-то конфликтует с VCL. Если это так, есть ли способ их таки заставить работать совместно?
vitality вне форума Ответить с цитированием
Старый 09.01.2008, 01:12   #8
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Может быть явно использовать Invalidate и Update? Еще можно попробовать InvalidateRect, только её скорее придется применить не к TImage, а к родительскому компоненту, например, к форме.
Jeni вне форума Ответить с цитированием
Старый 09.01.2008, 08:30   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Странно... TBitMap.Assign(TJpegImage); - перевод классов. В Таймере от DelphiX - в интервале = 0, пишете
TDXDraw.Surface.Canvas.Draw(0, 0, TBitMap);
TDXDraw.Flip; - вот так должно работать.
BOBAH13 вне форума Ответить с цитированием
Старый 10.01.2008, 09:09   #10
vitality
 
Регистрация: 04.01.2008
Сообщений: 5
По умолчанию

всё оказалось проще-просто gdi+ работает с PaintBox.
Вопрос в частности к Вован13 и всем кто работал с DelphiX.
У меня идет поток фотографий .jpeg. Я хочу каждую секунду сохранять фотографию и впоследствии из набора жпег фото сделать видео. Надо наверно копать в сторону DelphiX. Может кто уже занимался этим вопросом и может подсказать поточнее? Итак: из набора .jpeg фото сделать видео.
vitality вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jpeg warmbabe Общие вопросы по Java, Java SE, Kotlin 2 26.02.2010 20:14
Распаковка архивов Starscream Общие вопросы Delphi 2 25.06.2009 23:26
Распаковка архива. Формат нестандартный. RoadTrain Общие вопросы Delphi 20 17.12.2007 22:08
Распаковка архива Kashp Общие вопросы Delphi 2 23.08.2007 15:08
Отправка->Распаковка пакета Saxon Работа с сетью в Delphi 10 15.04.2007 20:56