Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Jpg.SaveToStream(mStream) Как ускорить работу ? Очень медленная работа сохранения файла  
:(
    Опции темы
crazynetwork
Дата 9.5.2016, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 16.10.2009

Репутация: нет
Всего: нет



В интернеты не посылать, уже все что есть прочитано. 
И так:
1. Программа "Удаленный рабочий стол"
2. Делаю скрин в Bitmap
3. Bitmap перевожу в Jpeg
4. Jpeg (пробовал и Bitmap)  сохраняю в MemoryStream

И тут то начинается самое интересное. Очень медленная работа строки 
Код
 Jpg.SaveToStream(mStream); 
 Причем если не закоментировать сохранение в поток, то сервер от клиента начинает пропускать сообщения (строки). Кто сталкивался с такой проблемой и знает как ускорить работу подобного кода? Или возможно есть варианты как переписать его. По ощущениям сохранениесохранение в файл проходит значительно быстрее, что очень странно 
Код
  Bmp.SaveToFile(ExtractFilePath(ParamStr(0))+'/'+IntToStr(i)+'.bmp' ); 
 Ниже есть ссылки на аналогичные проблемы, ну путей решения так и не предложено. Заранее всем благодарен за вразумительные ответы! 

http://www.delphimaster.net/view/8-1111615744/all
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=41300


Это сообщение отредактировал(а) crazynetwork - 9.5.2016, 13:46
PM MAIL   Вверх
Alexeis
Дата 10.5.2016, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(crazynetwork @  9.5.2016,  14:43 Найти цитируемый пост)
 По ощущениям сохранениесохранение в файл проходит значительно быстрее, что очень странно 

  Ничего странного. В указанном примере в файл сохраняется бмп, а в поток сохраняется jpeg. Это не просто сохранение в поток, это кодирование в jpeg, с последующим сохранением в поток. Jpeg это дискретное косинусное преобразование + Хаффман. Сам алгоритм сжатия в делфи реализован на С++ с использованием опен сорс библиотеки libjpeg . 
  Есть несколько путей решения. Если вам так понравился jpeg, то можно использовать его версию для сжатия потокового видео - https://ru.wikipedia.org/wiki/MJPEG . Можно использовать более быструю библиотеку libjpeg-turbo , можно использовать кодеки, которые имеют аппаратную реализацию на видеокарте или на процессоре https://software.intel.com/en-us/intel-ipp . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
crazynetwork
Дата 10.5.2016, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 16.10.2009

Репутация: нет
Всего: нет



Цитата(Alexeis @ 10.5.2016,  10:53)
Цитата(crazynetwork @  9.5.2016,  14:43 Найти цитируемый пост)
 По ощущениям сохранениесохранение в файл проходит значительно быстрее, что очень странно 

  Ничего странного. В указанном примере в файл сохраняется бмп, а в поток сохраняется jpeg. Это не просто сохранение в поток, это кодирование в jpeg, с последующим сохранением в поток. Jpeg это дискретное косинусное преобразование + Хаффман. Сам алгоритм сжатия в делфи реализован на С++ с использованием опен сорс библиотеки libjpeg . 
  Есть несколько путей решения. Если вам так понравился jpeg, то можно использовать его версию для сжатия потокового видео - https://ru.wikipedia.org/wiki/MJPEG . Можно использовать более быструю библиотеку libjpeg-turbo , можно использовать кодеки, которые имеют аппаратную реализацию на видеокарте или на процессоре https://software.intel.com/en-us/intel-ipp .

Пробовал заюзать libjpeg-turbo  но что то так и не получилось. Может быть у вас есть пример как взять BMP, кодировать в JPEG и сохранить его в MemoryStream. ?

Добавлено через 6 минут и 29 секунд
Или для моей задачи надо вовсе использовать другой алгоритм действий?
PM MAIL   Вверх
Alexeis
Дата 11.5.2016, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Да, там товарищ, который написал варпер сделал только пример загрузки (cgJpeg.pas) функцию сохранения нужно писать по аналогии 
jpeg_create_compress
jpeg_start_compress
jpeg_write_scanlines
jpeg_finish_compress
Чего и как делать для записи можно подсмотреть в оригинальной библиотке на С
https://raw.githubusercontent.com/libjpeg-t...aster/example.c
write_JPEG_file

Документацию по функциями jpeg_start_compress/jpeg_start_compress/jpeg_write_scanlines/jpeg_finish_compress
Можно найти тут
https://raw.githubusercontent.com/libjpeg-t...ter/libjpeg.txt


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 11.5.2016, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Хотя смотрю нашелся еще товарищ, который написал свой варпер
http://victor-vik.blogspot.md/2014/10/libj...-in-delphi.html
Код

//Кодирование изображения
procedure EncodeJpegTurbo(Source: TFastDIB; Quality: Integer; OnEncodedBuffer: TOnEncodedJpegBuffer);
var
  ScanLine: JSAMPROW;
  CompressedBuff: Pointer;
  CompressedSize: LongWord;
  JpegErr: jpeg_error_mgr;
  Jpeg: jpeg_compress_struct;
begin
  //Инициализация библиотеки
  InitLib;
 
  FillChar(Jpeg, SizeOf(Jpeg), 0);
  FillChar(JpegErr, SizeOf(JpegErr), 0);
 
  //Создаем структуру компрессора
  jpeg_create_compress(@Jpeg);
  try
    //Назначим дефолтный обработчик ошибок
    Jpeg.err := jpeg_std_error(@JpegErr);
 
    //Переопределим методы дефолтного обработчика. По умолчанию, при возникновении
    //любой ошибки в LibJPEG происходит закрытие приложения, и вывод ошибки в MessageBox
    JpegErr.error_exit := ErrorExit;
    JpegErr.output_message := OutputMessage;
 
    CompressedSize := 0;
    CompressedBuff := nil;
 
    //Используем свою реализацию jpeg_mem_dest из-за утечек памяти в стандартной.
    suJpegTurboMemDestUnit.jpeg_mem_dest(@Jpeg, @CompressedBuff, @CompressedSize);
    try
      jpeg.image_width := Source.Width;
      jpeg.image_height := Source.Height;
      jpeg.input_components := Source.Info.Header.BitCount div 8;
      jpeg.in_color_space := JCS_EXT_BGR;
 
      //Setting defaults
      jpeg_set_defaults(@Jpeg);
 
      //Качество сжатия
      jpeg_set_quality(@Jpeg, Quality, True);
 
      //Декодируем изображение
      jpeg_start_compress(@Jpeg, True);
      try
        while Jpeg.next_scanline < Jpeg.image_height do
        begin
          ScanLine := JSAMPROW(Source.Scanlines[Jpeg.image_height - Jpeg.next_scanline - 1]);
          jpeg_write_scanlines(@Jpeg, @ScanLine, 1);
        end;
      finally
        //Заканчиваем кодирование
        jpeg_finish_compress(@Jpeg);
      end;
 
      //Передаем буфер вызывающей процедуре
      if Assigned(OnEncodedBuffer) then
        OnEncodedBuffer(CompressedBuff, CompressedSize);
    finally
      //Освободим память
      FreeMemory(CompressedBuff);
    end;
  finally
    //Уничтожаем ненужные объекты
    jpeg_destroy_compress(@Jpeg);
  end;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.