суббота, 18 октября 2014 г.

Delphi: Быстрое (де)кодирование JPEG с помощью libjpeg-turbo

Как-то раз, вычитывая библиотеку для удаленного наблюдения за рабочим столом, я обратил внимание что куча ресурсов и времени занимает кодирование/декодирование JPEG. Изучив по ускорению этой процедуры сторонние решения, было решено использовать JpegTurbo.

Просто пример JPEG файла

Погуглив был найден проект delphi-jpeg-turbo, реализация которого мне не подошла по следующим причинам:
  • Реализован в виде наследника от TBitmap, я же использую TFastDib для нормальной многопоточной работы;
  • Устаревшие хидеры, автор использует декодирование в RGB формат, а потом попиксельно переводит его в требуемый Windows GDI GBR формат. Это занимает кучу времени, к тому же libjpeg-turbo умеет декодировать сразу в GBR, и в интернете не попалось ни одного примера где так сделано;
  • Загрузка из памяти: libjpeg-turbo имеет функции jpeg_mem_src и jpeg_mem_dest, которые позволяют сразу кодировать/декодировать из буфера не создавая кучу промежуточного кода; 

пятница, 3 октября 2014 г.

О подготовке архива с продуктом к публикации в сети

Зачастую, для распространения цифрового продукта авторы используют архивы, аргументами в пользу которых являются легкость создания, и пользователям удобно их распаковывать, но всегда ли?

Данная статья родилась в результате наблюдения за повторяющимися с завидной регулярностью ошибками в дистрибуции ПО, которых легко можно было бы избежать.

четверг, 2 октября 2014 г.

Сжатие DFM ресурсов в Delphi программах

Захотелось мне как-то попробовать сжать ресурсы dfm форм своего приложения, плюсы довольно спорные (сложные формы могут содержать много графических ресурсов которые в dfm файле хранятся как буфер с bmp, который конечно хочется сжать, так же защита от просмотра и редактирования ресурсов форм), но ведь есть несколько программ позволяющих такое делать, значит кому-то нужно.

Напишем приложение DFMCompressor, которое будет извлекать dfm ресурсы из exe файла, сжимать их и записывать обратно заменяя оригиналы.

пятница, 26 сентября 2014 г.

Как запустить консольное приложение и получить его вывод в OSX с помощью Delphi

Я только начал изучать разработку под мак, поэтому буду иногда выкладывать заметки от чайника для таких же чайников) Значит вот что я заметил: Mac OS основана на Unix, и для разработки под нее используется так называемое Posix API и Cocoa API. Posix API идет из Unix и совместим с ним, поэтому при поиске решений здорово искать решения для unix, а потом применять его в os x приложении.

Итак, для запуска консольного процесса и получения его данных используется Posix функция popen, которая не описана в хидерах Delphi, ее можно взять из хидеров Kylix (там вообще есть очень много из libc и все совместимо с Delphi).

Собственно решение (Проверялось на Delphi XE7):

четверг, 26 июня 2014 г.

Дружим свой софт с антивирусами: как избежать ложных срабатываний

В этой заметке я хочу рассказать о том, как решалась проблема ложного срабатывания антивирусов на наш продукт.


Если у вас таких проблем нет, но вы планируете защищать свое ПО с помощью протектора - рекомендую ознакомиться с материалом, так как скорее всего вам предстоит пройти то же самое.

суббота, 21 июня 2014 г.

Как узнать реальную версию Windows из режима совместимости

Думаю каждый читатель хотя бы раз сталкивался с ситуацией, когда на современной ОС не удавалось запустить старую программу, и помогал в этом случае режим совместимости Windows.
В основе работы данного механизма лежит перехват различных функций и эмуляция их поведения, свойственного указанной версии Windows, например, эмулируются ключи реестра, каталоги с документами и прочее. Все это нужно для того, чтобы программа думала, что запущена в выбранной среде.