Помимо стандартной библиотеки, содержащей основные модули языка С++, разработаны десятки, а то и сотни дополнительных библиотек. Каждая из этих библиотек содержит программы и подпрограммы, производящие ряд действий.
Использование сторонних библиотек сокращает объём кода и оптимизирует работу программы, поскольку решения, использован ные разработчиками библиотеки и оттестированные сотнями программистов в разноплановых проектах, после нескольких лет шлифовки достигают лучших показателей по всем параметрам.
Знание и использование ряда полезных библиотек сильно упрощает работу программиста. По этому признаку работодатели легко отличают уверенного профессионала от неопытного новичка.
В этой статье Вы сможете познакомиться с рядом полезных библиотек, которые активно используются разработчиками по всему миру.
Если Вам нужен удобный инструмент для работы с JavaScript, V8 подойдёт идеально.
Свои функции V8 реализует, используя специальные классы, написанные на с++ и объявленные в namespace V8. Работать с джава скрипт — структурами можно через привычную оболочку с++.
Схема взаимодействия объектов с++ и V8 реализована посредством использования v8::Handle (template-классов).
Установка V8 обычно не занимает много времени, а польза для тех, кому периодически приходится работать с JavaScript’ом, неоценима.
Кроме того, о библиотеках, с помощью которых могут взаимодействовать C++ и JavaScript очень любят спрашивать на собеседованиях. Поэтому даже, если вы не собираетесь работать с js , с V8 или другими подобными библиотеками лучше познакомиться.
Так или иначе, почти все разработчики на разных этапах сталкиваются с необходимостью отображать web – элементы. Чтобы всё выглядело красиво и в коде, и в конечном отображении, а выполнение этой задачи не отнимало слишком много времени и сил, существует библиотека WebKit.
Некоторые программисты называют WebKit «чёрным ящиком», органично перерабатывающим html, css и JavaScript в полноценные веб-страницы.
Awesomium — это библиотека для интеграции браузера (на базе Chromium) в своё приложение. Библиотека имеет 2 режима работы: Offscreen и Windowed.
В режиме Offscreen отрисовка и работа скриптов на экране не отображается.
В режиме Windowed средствами библиотеки эффективно выполняется отрисовка в «окне приписки» и обработка активности мыши и клавиатуры.
Awesomium активно применяется в десятках разных приложений. Описаны случаи интеграции этой библиотеки в 3D игры.
Существенный минус – отсутствие активного сообщества, способного познакомить новичка с библиотекой, ответить на вопросы и исправить ошибки. А документация, доступная для работы с Awesomium на с++, даёт довольно смутное представление о принципах работы библиотеки.
Тем не менее, Awesomium остаётся очень удобным инструментом, завоевавшим признание сотен разработчиков по всему миру.
Хотите упростить взаимодействие с сервером? – используйте Libcurl.
Libcurl помогает передавать данные (изображения, файлы и пр.) приложениям. Libcurl поддерживает 13 основных протоколов FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP.
Изначально cUrl предназначался для использования на языке С. Сейчас для работы с Libcurl разработаны модули интеграции к 30 языкам программирования. Что говорит о высокой популярности библиотеки в среде разработчиков. На это же указывает высокий рейтинг продукта.
Библиотек для сжатия данных довольно много, одна из самых удобных и популярных
Сжатие любых объёмов данных (даже превышающих объём памяти) с помощью zlib проводится предельно легко.
Zlib написана на языке С и применяется в тысячах проектов. Использование некоторых других библиотек невозможно без использования zlib. Примером такой библиотеки является основная библиотека для работы с растровой графикой в формате .png — libpng.
Libpng, написанная на C с использованием ассемблера, предназначена для работы с изображениями в формате .png.
Для работы с изображениями в формате .jpg существует библиотека libjpg (также написанная на С с использованием Ассемблера)
Обе библиотеки имеют подробные инструкции и множество примеров использования как в С, так и в С++.
Периодически возникает необходимость конвертировать файлы в формат pdf. Для этого процесса разработана динамическая библиотека DynaPDF.
DynaPDF – удобный гибкий инструмент. Формат .dll хотя и открывает достаточно широкие возможности, периодически становится причиной возникновения ошибок.
Для успешного устранения ошибок в сети есть много пошаговых инструкций.
Используется для программирования на языках C/C++, C#, Delphi, Lazarus, PHP, VB, VBA, and VB .Net.
Большая часть приложений нуждается во взаимодействии с базами данных. Оттуда получаются и туда передаются потоки необходимой информации. Поэтому большинство работодателей интересует умение соискателей работать с базами данных.
Libpq – удобная библиотека для взаимодействия С и PosgreSQL. Благодаря ей из кода С можно вносить изменения в базу данных, добавлять и безвозвратно удалять данные, создавать и удалять таблицы.
Существуют вариации libpq для C++, Python’a, Perl’a, Tcl, ECPG.
Ещё один важный пласт знаний для программиста – отладка и тестирование кода. Знание специфических библиотек, существенно упростит Вам решение этой задачи, а коллегам наглядно продемонстрирует уровень вашего профессионализма.
Библиотека Check предназначена для модульного тестирования всех возможностей программ, написанных на языке С. Существенным плюсом использования Check’а служит возможность запуска тестов в отдельных процессах для более точной диагностики причин возникновения ошибок, снижения скорости и т.п
Для модульного тестирования на языке С++ используется Google C++ Testing Framework (Google Test).
С помощью этой библиотеки создаются программы, отслеживающие трафик, поступающий на сетевую карту компьютера. Это может быть очень полезно для отладки программ, составления мониторинговых отчётов и т.п.
Pcap предназначена для работы с С и С++. Существуют обёртки, делающие эту библиотеку доступной для работы на других языках программирования.
Ещё Вам может пригодиться…
Libusb — это библиотека, которая позволяет обмениваться данными с USB-устройствами прямо из кода программы.
В библиотеке поддерживаются все типы передачи (управление / объем / прерывание / изохронность). Важный элемент библиотеки – журнал сообщений. Он помогает правильно расшифровать коды ошибок, поступающие от USB- устройств.
Предназначена для работы с С. Для других языков программирования разработаны обёртки. Для С++ — Libusbpp
Библиотека ZBar предназначена для распознавания штрихкодов из изображений.
ZBar имеет предельно простую и логичную документацию без «тёмной магии» и необъяснимых функций.
Работать с ней легко и удобно. Можно использовать из программных интерфейсов С, С++, Питона и других языков программирования.
Большинство описанных библиотек работают и под Windows, и под Linux, и под macOS, и под BSD. Разработчики библиотек предоставляют подробную техническую документацию, а комьюнити готово поделиться пошаговыми инструкциями по установке и ответить на любые рабочие вопросы.
Умение работать с библиотеками – важный навык для любого программиста. Это своеобразный показатель его профессионального уровня и понимания процесса разработки.
Библиотеки помогают решить множество сложных задач, возникающих при разработке кода. Чем теснее Вы с ними «подружитесь», тем шире будет круг ваших профессиональных возможностей.
Не бойтесь новых задач – ищите их решение.
Пишите код, тестируйте и оттачивайте его до блеска. А команда progtips.ru всегда придёт Вам на помощь!
Вы думаете, это все полезные библиотеки? Нет! На десерт мы оставили самое интересное.
В следующем выпуске Вас ждут:
— лучшие графические библиотеки для С++;
— чем пользуются разработчики компьютерных игр в России и на Западе;
и как по графической библиотеке отличить любителя от профессионала.
Библиотека libxml2 для работы с XML-файлами
Рисуем фракталы с помощью PHP и Cairo. Часть 3. Фракталы на комплексной плоскости
Ниже рассмотрены библиотеки на C/C++, которые могут быть использованы в основе разработки библиотеки для генерации 2D финансовых графиков и индикаторов технического анализа.
Основными требованиями являются:
Итог к рассмотрению:
Расширение для C++ форка GraphicsMagick библиотеки ImageMagick. С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах. В отличии от родителя (IMagick) разработчики делают упор на производительности, оптимизации и безопасности.
Сайт: http://www.graphicsmagick.org/
Примеры: http://www.imagemagick.org/Magick++/Image++.html
Расширение для C++: http://www.graphicsmagick.org/Magick++/
Расширение для Python: https://github.com/hhatto/pgmagick
Python-пакет PgMagick может работать как с GraphicsMagick, так и с ImageMagick. Библиотека интегрирована в Python с помощью Python-Boost. В отличие от Wand-Py работает в десятки раз быстрее, но при этом имеет худшую документацию для Python (надо все искать в документации C++-расширения Magick++).
Расширение для C++ популярной библиотеки ImageMagick (IMagick). С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах.
Сайт: http://imagemagick.org/script/index.php
Примеры: http://www.imagemagick.org/Magick++/Image++.html
Расширение для C++: http://imagemagick.org/Magick++/
Расширение для Python: http://docs.wand-py.org/
Пример IPython: https://gist.github.com/emcconville/a0dd134bfa2b12c96377
Wand-Py работает крайне медленно по сравнению с Pillow (форк стандартной библиотеки PIL для Python). Не удалось решить проблемы со шрифтами (добавляет сглаживание и размытие).
Библиотека написанная на C для рендеринга векторной графики. Содержит функции для рисования двумерных изображений. Преимуществом отмечается (на форумах) хорошая документация. Работает медленнее SKIA (есть сравнение в интернете).
Сайт: https://www.cairographics.org/
Примеры: https://www.cairographics.org/samples/
Расширение для C++: https://www.cairographics.org/cairomm/
Расширение для Python: http://pythonhosted.org/cairocffi/
Графическая библиотека написанная на C++ для рендеринга векторной графики. Используется в Google Chrome, Chrome OS, Mozilla Firefox, Android. Поддерживается Google. Куцая документация, но есть примеры. По сравнению с Cairo работает быстрее.
Сайт: https://skia.org/
Примеры: https://skia.org/user/api/skcanvas
Расширение для Python: https://github.com/expobrain/python-skia
Библиотека растровой графики написанная на C++. Последняя версия выпущена в 2006 году. Есть предположение, что данная библиотека лежит в основе PIL для Python (и Pillow).
Сайт: http://www.antigrain.com/
Библиотека для работы с растровой графикой написанная на C. Популярна в PHP. В Python с похожим функционалом доступен пакет Pillow, который и рекомендуется использовать.
Сайт: https://libgd.github.io/
Примеры: https://libgd.github.io/pages/faq.html
Расширение для Python: https://github.com/Solomoriah/gdmodule
Форк стандартной библиотеки PIL для Python. Работает быстро. Корректно работает со шрифтами. Документации мало, но разобраться можно.
Сайт: http://pillow.readthedocs.io/
Примеры: http://pillow.readthedocs.io/en/3.3.x/reference/ImageDraw.html
Группированный список различных библиотек для C/C++ с кратким описанием и ссылкой на источник.
https://github.com/fffaraz/awesome-cpp
VKontakte
Весь сервис можно описать как обертку вокруг графической библиотеки. Именно от качества, производительности и удобства использования графической библиотеки зависит качество всего проекта. Несложно догадаться, что в качестве графической библиотеки в Uploadcare используется Pillow.
Pillow представляет из себя нативный модуль для Python, половина кода написана на С, половина — на Python. Версии Python поддерживаются самые разнообразные: 2.7, 3.3+, PуPу, PуPуЗ.
Pillow-SIMD — это не форк в классическом понимании, когда проект начинает жить собственной жизнью. Это замена Pillow, то есть вы устанавливаете одну библиотеку вместо другой, ни строчки не меняете в своем исходном коде, и получаете большую производительность.
Pillow-SIMD можно собирать с инструкциями SSE4 (по умолчанию). Это набор инструкций, который есть практически во всех современных x86 процессорах. Также Pillow-SIMD можно собирать с набором инструкций AVX2. Этот набор инструкций есть, начиная с архитектуры Haswell, то есть примерно с 2013 года.
К сожалению, эта библиотека пока не поддерживается в PyPy, потому что OpenCV базируется на numpy, а numpy только недавно стал работать под PyPy, и в OpenCV поддержки PyPy все еще нет.
Это довольно старая библиотека — 1993 года, но она обогнала своё время. О ней долгое время было мало, что слышно, но в последнее время для VIPS стали появляться биндинги под разные языки, в том числе для Go, Node.js, Ruby.
Я долгое время хотел попробовать эту библиотеку, пощупать, но мне это не удавалось по очень глупой причине. Я не мог разобраться, как установить VIPS, потому что биндинг собирался очень сложно. Но теперь (в 2017 году) вышел биндинг pyvips от автора самого VIPS, с которым уже нет никаких проблем. Теперь установка и использование VIPS очень простая. Поддерживаются: Python 2.7, 3.3+, PуPу, PуPуЗ.
Это самые старые библиотеки из тех, о которых я сегодня упомянул (1990 год). За все это время было несколько биндингов для Python, и почти все из них благополучно умерли к настоящему моменту. Из тех, что можно использовать, остались:
Производительность — это не такая простая штука. Нельзя просто сказать, что одна библиотека работает быстрее другой. В каждой библиотеке есть набор функций, и каждая функция работает с разной скоростью.
Соответственно, корректно говорить только о том, что производительность одной функции выше или ниже в конкретной библиотеке. Либо у вас есть приложение, которому нужен некий набор функциональности, и вы делаете бенчмарк именно под эту функциональность, и говорите, что для вашего приложения такая-то библиотека работает быстрее (медленнее).
Недавно в статье, где сравнивалась производительность Pillow и OpenCV, мне попался такой код:
from PIL import Image, ImageFilter.BoxBlur
im.filter(ImageFilter.BoxBlur(3))
...
import cv2
cv2.blur(im, ksize=(3, 3))
...
Пример: Гауссово размытие в OpenCV.
Слева — радиус 3, справа — 30. Как видно, разница в скорости более чем в 10 раз.
Когда передо мной встала задача добавить размытие по Гауссу в мое приложение, меня не устраивало, что гипотетически может тратиться 900 мс на выполнение одной операции. Таких операций в приложении тысячи в минуту, и тратить столько времени на одну — нецелесообразно. Поэтому я изучил вопрос и реализовал в Pillow размытие по Гауссу, которое работает за константное время относительно радиуса. То есть на производительность Гауссова размытия влияет только размер картинки.
Но здесь главное не то, что что-то работает быстрее или медленнее.
Я хочу донести, что, когда вы строите какую-то систему, важно понимать, от каких параметров зависит сложность на выходе. Тогда вы сможете ограничить эти параметры или другими способами бороться с этой сложностью.
На графике представлена производительность (больше — лучше) разных библиотек для операции уменьшения изображения в 8 и в 1,25 раз.
Для PIL результат 17 Mpx/s означает, что фотографию с айфона (12 Mpx) можно уменьшить в 1,25 раз чуть меньше, чем за секунду. Такой производительности недостаточно для серьезного приложения, которое этих операций выполняет очень много.
Я стал оптимизировать производительность ресайза, и в Pillow 2.7 мне удалось добиться двукратного прироста производительности, а в Pillow 4.3 — трехкратного (на данный момент актуальна версия Pillow 5.3, но производительность ресайза в ней та же).
Но операция ресайза — это такая штука, которая очень хорошо ложится на SIMD. Она подходит к single instruction, multiple data, и поэтому в текущей версии Pillow-SIMD мне удалось в 19 раз увеличить скорость ресайза по сравнению с оригинальной Python Imaging Library при использовании тех же самых ресурсов.
Это существенно выше производительности ресайза в OpenCV. Но сравнение это не совсем корректное, потому что в OpenCV используется чуть менее качественный способ ресайза бокс-фильтром, а в Pillow-SIMD ресайз реализован с помощью сверток.
Это неполный список тех операций, которые ускорены в Pillow-SIMD по сравнению с обычной Pillow.
Оказалось, что Pillow-SIMD на этом наборе работает в 2 раза быстрее, чем Pillow. В самом конце находится Wand (напомню, что это ImageMagick).
Но меня заинтересовало другое — почему такие низкие результаты у OpenCV и VIPS, ведь это библиотеки, которые тоже разработаны с прицелом на производительность? Оказалось, что в случае OpenCV, та бинарная сборка OpenCV, которая ставится с помощью pip, собрана с медленным кодеком JPEG (автор сборки был уведомлен, на 2018 год эта проблема уже решена). Она собрана с libjpeg, в то время как в большинстве систем, по крайней мере debian-based, используется libjpeg-turbo, которая работает в несколько раз быстрее. Если собрать OpenCV из исходников самому, то производительность будет больше.
В случае VIPS ситуация другая. Я связался с автором VIPS, показал ему этот бенчмарк, мы с ним довольно долго и плодотворно переписывались. После чего автор VIPS нашел несколько мест в самом VIPS, где исполнение было не по оптимальному маршруту, и исправил их.
Вот что будет с производительностью, если собрать OpenCV из исходников текущей версии, а VIPS — из master, который уже есть сейчас.
Даже если вы нашли какой-то бенчмарк, еще не факт, что все будет работать именно с такой скоростью именно на вашей машине.
На GitHub есть проект с фреймворками для тестирования, где каждый может предложить свои бенчмарки или поправить существующие.
2. На уровне графических операций — то, что как раз есть в большинстве графических библиотек. Когда графическая библиотека получает какую-то операцию, она внутри себя создает необходимое количество потоков, разбивает одну операцию на несколько более мелких, и выполняет их. При этом реальное время выполнения уменьшается — одна операция выполняется быстрее. Но пропускная способность растет далеко не линейно от количества ядер. Есть операции, которые не параллелятся, и яркий пример — это декодирование PNG-файлов — его никак нельзя распараллелить. Кроме того, есть накладные расходы на создание потоков, разбиение задач, которые тоже не дают пропускной способности расти линейно.
3. На уровне команд процессора и данных. Мы специальным образом подготавливаем данные и используем специальные команды, для того чтобы процессор работал с ними быстрее. Это подход SIMD, который, собственно, и используется в Pillow-SIMD. Реальное время выполнения уменьшается, пропускная способность растет — это беспроигрышный вариант.
Конечно, это не правда, потому что GIL на самом деле не дает выполняться двум потокам на Python, а если код написан на другом языке, и во время своей работы не использует внутренние структуры Python, то этот код может отпускать GIL и таким образом освобождать интерпретатор под другие задачи.
Многие библиотеки для работы с графикой освобождают GIL во время своей работы, в том числе Pillow, OpenCV, pyvips, Wand. Не освобождает только одна — pgmagick. То есть вы можете спокойно создавать потоки под выполнение каких-то операций, и это будет работать параллельно с остальным кодом.
Но возникает вопрос: сколько создавать потоков?
Если мы будем создавать бесконечное количество потоков под каждую задачу, которая у нас есть, то они просто займут всю память и весь процессор, — мы не получим никакой эффективной работы. Я сформулировал специальное правило.
Правило N + 1Для продуктивной работы нужно создавать не более N + 1 воркеров, где N — количество ядер или потоков процессора на машине, а воркер — это процесс или поток, занятый обработкой.
Например, у нас в приложении используется N + 1 instance Tornado, балансировку между которыми осуществляет ngnix. Если упомянуто Tornado, то давайте поговорим об асинхронной работе.
Но есть проблема — когда мы вызываем какую-то обработку, она вызывается синхронно. Даже если библиотека отпускает в этот момент GIL, все равно Event Loop блокируется.
@gen.coroutine
def get(self, *args, **kwargs):
im = process_image(...)
...
@run_on_executor(executor=ThreadPoolExecutor(1))
def process_image(self,
...
@gen.coroutine
def get(self, *args, **kwargs):
im = yield process_image(...)
...
Соответственно, графическая библиотека для построения хорошего приложения должна обладать некоторыми плюшками по вводу/выводу именно из файлов.
>>> from PIL import Image
>>> %time im = Image.open()
Wall time: 1.2 ms
>>> im.mode, im.size
('RGB', (2152, 1345))
>>> from PIL import Image
>>> %time im = Image.open()
Wall time: 1.2 ms
>>> im.mode, im.size
('RGB', (2152, 1345))
>>> %time im.load()
Wall time: 73.6 ms
Эти несоответствия бывают по разным причинам. Иногда это ошибки передачи по сети, иногда — просто какие-то кривые кодеки, которыми кодировалось изображение. По умолчанию Pillow, когда видит изображения, которые не соответствуют формату до конца, просто кидает исключение.
from PIL import Image
Image.open('trucated.jpg').save('trucated.out.jpg')
IOError: image file is truncated (143 bytes not processed)
from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.open('trucated.jpg').save('trucated.out.jpg')
Даже обрезанная картинка — это все равно лучше, чем ничего — просто страница с ошибкой.
В таблице выше я собрал все, что касается ввода/вывода в тех библиотеках, о которых я рассказываю. В частности, я посчитал количество кодеков различных форматов, которые есть в библиотеках. Получилось, что в OpenCV их меньше всех, в ImageMagick — больше всех. Похоже, что в ImageMagick можно открыть вообще любое изображение, которое вам встретится. У VIPS 12 собственных кодеков, но VIPS может использовать ImageMagick в качестве промежуточного звена. Я не проверял, как это работает, надеюсь, что бесшовно.
В Pillow 17 кодеков. Это сейчас единственная библиотека, в которой нет автоповорота EXIF. Но сейчас это небольшая проблема, потому что можно прочитать EXIF самому и повернуть изображение в соответствии с ним. Это вопрос небольшого сниппета, который легко гуглится и занимает максимум в 20 строчек.
Но это не все. На самом деле у OpenCV есть еще особенности. Когда мы просто открываем какую-то картинку, то вызов cv2.imread(filename)
поворачивает JPEG-файлы в соответствии с EXIF (см. таблицу), но при этом игнорирует альфа-канал у PNG-файлов — довольно странное поведение!
К счастью, в OpenCV есть флаг: cv2.imread(filename, flags=cv2.IMREAD_UNCHANGED)
.
Если указать флаг IMREAD_UNCHANGED, то OpenCV оставляет альфа-канал у PNG-файлов, но перестает поворачивать JPEG-файлы в соответствии с EXIF. То есть один и тот же флаг влияет на два совершенно разных свойства. Как видно из таблицы, у OpenCV нет возможности прочитать EXIF, и получается, что в случае с этим флагом невозможно повернуть JPEG вообще.
Что делать, если вы заранее не знаете, какого формата у вас изображение, и вам нужны и альфа-канал у PNG, и автоповорот у JPEG? Ничего не сделать — OpenCV так не работает.
Причина, почему в OpenCV такие проблемы, кроется в названии этой библиотеки. В ней очень много функциональности для компьютерного зрения и анализа изображений. По сути, OpenCV рассчитана на работу с верифицированными источниками. Это, например, камера наружного наблюдения, которая раз в секунду скидывает изображения, и делает это в течение 5 лет в одном и том же формате и одном и том же разрешении. Здесь не нужна вариативность в вопросе ввода/вывода.
Людям, которым нужна функциональность OpenCV, не сильно нужна функциональность работы с пользовательским контентом.
Но что делать, если в вашем приложении все-таки нужна функциональность работы с пользовательским контентом, и в то же время нужна вся мощь OpenCV по обработке и статистике?
Решение в том, что нужно совмещать библиотеки. Дело в том, что OpenCV построен на базе numpy, и в Pillow есть все средства для того, чтобы экспортировать изображения из Pillow в массив numpy. То есть мы экспортируем массив numpy, и OpenCV может дальше работать с этим изображением, как со своим собственным. Это делается очень легко:
import numpy
from PIL import Image
...
pillow_image = Image.open(filename)
cv_image = numpy.array(pillow_image)
import numpy
from PIL import Image
...
pillow_image = Image.fromarray(cv_image, "RGB")
pillow_image.save(filename)
Надеюсь, это поможет вам построить нагруженное приложение для работы с графикой.
Узнать некоторые другие секреты разработки на Python, перенять бесценный и местами неожиданный опыт, а главное обсудить свои задачи можно будет уже совсем скоро на Moscow Python Conf++. Например, обратите внимание на такие имена и темы в расписании.
- Donald Whyte с историей о том, как с помощью популярных библиотек, хитрости и коварства делать математику в 10 раз быстрее, а код — понятным и поддерживаемым.
- Андрей Попов про сбор огромного количества данных и их анализ на наличие угроз.
- Ефрем Матосян в своем докладе «Make Python fast again» расскажет, как увеличить производительность демона, обрабатывающего сообщения из шины.
Полной список того, что предстоит обсудить за 22 и 23 октября тут, успевайте присоединиться.
Мы расскажем о 17 полезных библиотеках и инструментах, которые используют Frontend-разработчики Студии Т. Речь пойдет о технологиях, в ценности которых убедились на личном опыте. Каждая из них увеличит продуктивность и поможет в реализации конкретной задачи.
В данной статье под инструментами подразумеваются вспомогательные средства разработки. Они облегчают процесс, при этом не являются обязательной частью проекта.
Fontsquirrel — генератор веб-шрифтов. Загружаешь файл шрифта — получаешь несколько форматов и уже готовый файл со стилями, который можно подключить.
Colorzilla — колорпикер. Аналог пипетки в Photoshop. Решает задачи с цветом. Позволяет получить образец цвета из любой точки браузера и скопировать в нужную программу. Анализирует страницу на палитру цветов и создает расширенные CSS градиенты.
Препроцессор Sass — простой язык стилей и мощный препроцессор. Легкая читабельность кода. Благодаря подключенной библиотеке Compass можно выйти за рамки CSS и работать со спрайтами в автоматическом режиме.
Sprite — простой способ сделать из множества картинок одну. Предположим, у вас на сайте четыре картинки. Когда пользователь заходит на страницу, он подгружает эти изображения. Sprite создает контейнер и помещает изображения в него. Количество обращений к серверу сокращается и подгружаются даже те картинки, которые понадобятся позже.
PhpStorm — среда разработки. Содержит отличное автодополнение кода. Поддерживает смешивание языков. В него встроен git, который позволяет работать с сервером, минуя лишнее открытие консоли. Удобная установка плагинов. Включает в себя опознаватель языка php для бэкенда. Включает гибкую систему настроек для разработчика.
git — система контроля версий. Обладает высокой скоростью работы, интеграцией с другими системами, удобным инт
Системные типы и классы HBITMAP, Bitmap и им подобные рассчитаны, в первую очередь, на вывод на экран. Для них существует множество функций рисования геометрических примитивов, вывода текста, но при этом отсутствует прямой доступ к пикселям изображения. Функции Bitmap::GetPixel и им подобные работают непозволительно долго.
Оптимальным вариантом является работа с изображением непосредственно в памяти. Это можно сделать двумя способами:
Двумерные изображения хранятся в памяти в виде одномерных массивов. Обычно они записываются построчно: сначала идёт 0-я строка, затем 1-я и т.д. Последовательный доступ к памяти осуществляется быстрее, чем произвольный. Поэтому обход по изображению нужно делать так, чтобы доступ к памяти был последовательный: во внешнем цикле производится обход по вертикали, а во внутреннем — по горизонтали:
for (int y = 0; y
for (int x = 0; x
...
Также стоит быть аккуратным при использовании двумерных массивов в C# (а лучше вообще их не использовать, написав класс-обёртку для одномерных массивов): в них первый индекс — это строка (Y-координата), а вторая — столбец (X).
Вы всегда можете ознакомиться с форматами графических файлов и написать свои функции (классы, библиотеки) для чтения и сохранения изображений в желаемых форматах. Однако если для формата BMP написание подобных функций не составляет труда, то для более популярных форматов, таких как JPEG и PNG, написание своего декодера — идея не из лучших.
Существует множество сторонних библиотек для работы с изображениями в C++, которые можно использовать для загрузки и сохранения и загрузки изображений, однако в системе Windows для этих задач можно использовать встроенную библиотеку GDI+. Общий принцип работы такой: загрузить изображение в класс Gdiplus::Bitmap, получить прямой доступ к пикселям изображения и преобразовать изображение во внутреннее представление.
Ниже приложены проекты для Microsoft Visual Studio 2010, в которых реализованы функции чтения и записи изображений:
Goutte используется для скрапинга веб-сайтов и извлечения данных. Лицензия — MIT. Предоставляет обширный API для обхода сайтов/блогов и извлечения данных из HTML/XML.
GoogChart является классом PHP для создания динамичных диаграмм с помощью Google Charts. Не распространяется на весь API Google Charts, но делает их очень простыми в использовании.
Название говорит за себя. Это класс PHP, который генерирует анимированные GIF из нескольких изображений. Вам просто нужно указать изображения и продолжительность их отображения, вот и все. Размер и прозрачность определяются по первому кадру.
dBug является PHP-версией ColdFusion-ского sfdump. Он отображает цветную и хорошо структурированную информацию о переменной в табличном виде. Стили можно редактировать, таблицу можно сворачивать/разворачивать. dBug также можно заставить изменить вывод данных определенных типов. Например, вы можете настроить вывод объектной переменной в виде массива.
Alice позволяет мгновенно генерировать сотни фейковых данных (фикстуры) в целях тестирования. Вы можете генерировать сложные данные с ограничениями, которые легко читать и редактировать. Позволяет контролировать диапазоны фикстур, необязательные данные, значения объектов и уникальные ограничения.
PHPGeo — простая библиотека для измерения расстояния между двумя координатами с высокой точностью. Она использует формулу Гаверсинуса и Винсента для вычисления расстояния. Вы можете интегрировать ее с любым приложением, связанным с картами или местоположениями.
Если вы планируете разработать geo aware приложение, взгляните на Geocoder. Это расширяемая PHP-библиотека делится на 2 части: Provider и HttpAdapter. Она также предлагает дополнительный уровень абстракции для геокодирования.
Purl — объектно-ориентированная библиотека для работы с URL. Вы можете легко создавать экземпляры URL и вызывать по цепочке методы после создания URL. Библиотека поддерживает манипуляции путем, фрагментом и запросом.
Snappy позволяет создавать снимки, миниатюры и PDF по URL или HTML страницы. Эта библиотека использует WebKit на основе wkhtmltoimage и wkhtmltopdf, доступна для Windows, OSX и Linux.
ShellWrap — библиотека, которая позволяет использовать мощные инструменты Unix/Linux в PHP. Вы можете легко вызывать команды, используя простой синтаксис и обработку ошибок исключениями PHP. Все аргументы должным образом экранируются, пути к исполняемым файлам будут разрешены автоматически.
Unirest — это коллекция легких HTTP-библиотек, которые идеально подходят для многочисленных приложений. Выполняет PUT, DELETE, PATCH, GET и POST запросы. Поддерживается gzip, базовая аутентификация, загрузка файлов, формы, настраиваемые тайм-ауты и заголовки по умолчанию для каждого запроса.
IniScan — это инструмент, предназначенный для сканирования php.ini файлов на предмет безопасности. Ищет распространенные ошибки безопасности и рапортует о результатах. Можно задавать порог для правил сканирования, чтобы найти ошибки выше указанного уровня.
PHP Captcha можно использовать для генерации аудио и видео капчи. Поддерживает вращение символов, выбор размера шрифта, выбор набора символов, случайный или указанный фон, дополнительный отображаемый текст и тень символов.
Ratchet — слабо связанная PHP библиотека, которая предлагает различные инструменты для разработки в режиме реального времени, двунаправленную связь приложения между сервером и клиентом через WebSockets. Есть много легкодоступных компонентов. Вы можете написать собственное приложение-чат за несколько минут.
TCPDF — PHP-класс (открытый) для создания PDF-документов. Он поддерживает все стандартные форматы страницы, пользовательский формат страниц, UTF-8, PDF аннотации, в том числе ссылки, режим рендеринга текста, набор шрифтов, растягивание текста и интервал, сжатие страниц, TrueTypeUnicode и OpenTypeUnicode.
Библиотека Munee может использоваться для компиляции на лету CoffieScript, Less, SCSS, изменения размера изображения, сжатия JS & CSS, и кэширования результата на стороне сервера и клиента, без изменения assets в шаблоне. В целом, это хороший вариант для достижения молниеносных запросов и сохранения пропускной способности.
HTML Purifier — библиотека для фильтрации HTML, разработанная для удаления всего вредоносного кода. Может быть использована для защиты кода от XSS атак. Эта библиотека использует надежные белые списки, агрессивный разбор, и убеждается, что в результате разметка соответствует стандартам.
Detector — открытая библиотека для определения многочисленных сведений о пользователях/посетителях. Это может помочь вам построить точные веб-аналитики. Она отображает пользовательский агент, тип устройства, используемый браузер вместе с его HTML и CSS возможностями. Также сообщает, кто запросил данные — человек или бот.
Whoops поможет вам работать с ошибками и исключениями в менее болезненной форме. Предоставляет отличный интерфейс, сообщающий вам подробную информацию об ошибках и исключениях, присутствующих в коде (с подсветкой). Кроме того, поддерживает JSON, XML, SOAP и AJAX.
Gaufrette обеспечивает уровень абстракции для файловой системы, что позволяет вам разрабатывать приложения без необходимости знать, где и как будут сохранены медиа-файлы. Также позволяет менять расположение файлов без изменения исходного кода, кроме определения файловой системы.
Imagine, это богатая объектно-ориентированная библиотека для работы с изображениями. Она может обрабатывать различные операции, такие как открытие, сохранение, создание, изменение размеров, водяные знаки, создать коллаж, делать отражение изображения и т.д. Система координат Imagine позволяет рисовать различные фигуры на изображениях. Класс для работы с цветом помогает создавать значения RGB для применения цветов к изображениям. Он также поддерживает слои и манипуляции для анимированных GIF.
Idiorm — легковесный ORM и гибкий конструктор запросов для PHP5, представляющий собой надстройку над PDO. С ним не надо будет писать длинные и рутинные SQL запросы. Кроме того, он не требует ни XML настроек, ни классов моделей, ни генераторов кода.
Как следует из названия, это высоко производительная система кэширования. Она предназначена для ускорения динамических веб-приложений за счет снижения нагрузки на базы данных. Она поддерживает несколько методов кэширования (период может быть явно определен), включая MemCache, Memcached, файлы, wincache, mpdo, pdo и apc. Вы не должны переписывать свой PHP класс для кэширования снова, при изменениях на серверах.
JpGraph — PHP библиотека для создания объектно-ориентированных графиков. Имеет более 200 встроенных флагов стран, 400 именованных цветов и поддерживает дополнительно диаграммы Ганта, несколько Y-осей, альфа-смешивание и внутреннее кэширование (с таймаутом). Эта библиотека позволяет строить линейные диаграммы, гистограммы, пироги, карты, свечи, полярные, радар, круговые и контурные диаграммы любого размера.
Читайте: 20+ Полезных онлайн инструментов для создания графиков и диаграмм.
SEOstats — мощная библиотека с открытым исходным кодом, которая предоставляет различные относящиеся к SEO показатели, такие как детальный анализ обратных ссылок, рейтинг страницы, тренды сайта, ключевые слова, статистика трафика, Alexa rank и многое другое. Она собирает данные от Alexa, Google, Moz, open site explorer, SEMRush, Facebook и Twitter.
PHP Parser написан на PHP для упрощения статического анализа кода и манипуляций. Он преобразует исходный код PHP в абстрактное синтаксическое дерево. Синтаксическое дерево поможет вам легко проанализировать проблемы кода и ошибки. Кроме того, вы можете превратить синтаксическое дерево обратно в PHP код. Пример показан на изображении, где белая часть представляет простой код, а черный участок содержит сгенерированное синтаксическое дерево.
PHP Error — библиотека, которая используется для преобразования обычных сообщений об ошибках в более наглядные с полной подсветкой синтаксиса и с фрагментами кода. Она исправляет некоторые сообщения об ошибках, которые просто неверны и применима для AJAX. Кроме того, вы можете вручную выключать или включать ее, запускать отдельные разделы без сообщений об ошибках и игнорировать выбранные файлы.
PHP-CPP — библиотека C++, которая может быть использована для разработки расширений PHP. Она построена с помощью простых в использовании и хорошо документированных классов для создания собственных расширений для PHP. Это может ускорить вашу программу, потому что код, написанный на C++ выполняется быстрее, чем на PHP.
Eden — набор повторно используемых компонентов, который работает практически со всеми PHP-фреймворками и CMS. Охватывает компоненты для автозагрузки, кэша, файловых систем, веб сервисов, шаблонов, интернационализации, платежных систем и облачных технологий. Работает с основными веб-сервисами, включая Google, Facebook, Yahoo, PayPal, Tumblr, Foursquare и Amazon Web Services.
Locust — простой в использовании инструмент тестирования пользовательской нагрузки. Он может быть использован для выяснения, сколько одновременных пользователей выдержит система. Позволяет писать сценарии на Python. У Locust отличный интерфейс (HTML + JS), который отображает важные данные в режиме реального времени.
Библиотека | Описание | Лицензия | Конфигурация |
---|---|---|---|
Aquila | Кросс-платформенная библиотека DSP|||
FFTW | библиотека для вычисления ДПФ | ||
KFR | Быстрая современная структура DSP, DFT / FFT, передискретизация звука, FIR / IIR фильтры, Biquad | ||
soundtouch | |||
Библиотека | Описание | Лицензия | Конфигурация |
тест | Библиотека для тестирования фрагментов кода, аналогичная модульным тестам. | Лицензия Apache 2.0 | CMake |
Celero | Лицензия Apache | CMake | |
gperftools | «Google Performance Tools» включает высокопроизводительную многопоточную реализацию malloc, а также инструменты для тестирования распределения кучи и загрузки ЦП. | BSD с 3 пунктами «Новая» или «Пересмотренная» лицензия | настроить |
plf :: нанотаймер | Класс кросс-платформенного простого таймера с наименьшими издержками для сравнительного анализа. | zlib лицензия | |
Библиотека | Описание | Лицензия | Конфигурация |
ACE | асинхронная сеть, демультиплексирование событий, обмен сообщениями | ||
Apache Thrift | Программный фреймворк Apache Thrift для масштабируемой разработки межъязыковых сервисов объединяет программный стек с механизмом генерации кода для создания сервисов, которые эффективно и без проблем работают между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C # , Какао, JavaScript, Node.js, Smalltalk, OCaml и Delphi и другие языки. | ||
Boost.Asio | асинхронная и синхронная сеть, таймеры, последовательный ввод / вывод | ||
Boost.Beast | БиблиотекаHTTP и WebSocket, построенная поверх Boost.Asio | ||
Брип | Одноранговая библиотека высокого уровня на основе событий, позволяющая пользователям напрямую отправлять и получать объекты. | Общественная лицензия Европейского Союза 1.1 | CMake |
C ++ REST SDK | асинхронный HTTP-клиент и слушатель, асинхронный поток, URI, JSON | Лицензия MIT | CMake |
C ++ RESTful фреймворк | Микро-фреймворкC ++, предназначенный для встраивания в широкий спектр приложений. | CMake | |
cpp-netlib | cpp-netlib: Сетевая библиотека C ++ | Лицензия на программное обеспечениеBoost 1.0 | CMake |
cpr | современная библиотека HTTP-запросов C ++ | Лицензия MIT | CMake |
завиток | C ++ оболочка для библиотеки CURL | ||
EasyHttp | Кросс-платформенная клиентская библиотека HTTP, ориентированная на удобство использования и скорость, поддерживающая кеширование HTTP-ответов и многое другое. | Лицензия MIT | CMake |
eCAL | высокопроизводительное межпроцессное взаимодействие | Лицензия Apache 2.0 | CMake |
штраффтп-сервер | Библиотека ftpдля windows и unix | Лицензия MIT | CMake |
gRPC | gRPC — это современная высокопроизводительная среда RPC с открытым исходным кодом, которая может работать в любой среде. | ||
г мыла | Набор инструментов разработкиC / C ++ для привязок данных XML, быстрые веб-службы WSDL / SOAP / XML, службы WS-Security, JSON / XML-RPC RESTful | ||
HTTPP | Простой, готовый к работе HTTP-сервер, созданный на основе Boost, и клиент, созданный на основе libcurl. | BSD, «Упрощенная» лицензия из 2 пунктов | CMake, Makefile |
IXWebSocket | Открытый исходный код WebSocket + HTTP-библиотека без зависимости, поддерживает SSL и расширение WebSocket для дефлятирования сообщений. | BSD с 3 пунктами «Новая» или «Пересмотренная» лицензия | CMake, Makefile |
KCP | Быстрый и надежный протокол ARQ, помогающий приложениям уменьшить задержку в сети. | Лицензия MIT | CMake |
libashttp | асинхронная клиентская библиотека HTTP | Стандартная общественная лицензия ограниченного применения GNU v3.0 | |
либнавахо | ФреймворкC ++, включая быстрый многопоточный http-сервер, веб-узлы HTML5, SSL, X509 и HTTP-аутентификацию, сжатие, файлы cookie и расширенное управление сеансами, IPv4 и IPv6 (CeCILL-C). | ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ С БЕСПЛАТНЫМ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ CeCILL-C | CMake |
либтинов | Библиотека создания и анализа сетевых пакетов | ||
нанометров | быстрая очередь сообщений, преемник zeromq | ||
нгхттп2 | HTTP / 2 C Библиотека и инструменты (сервер, клиент, прокси и инструменты для тестирования) | Лицензия MIT | CMake, настроить |
нгрест | Быстрая и простая в использовании JSON RESTful Web Services Framework | Лицензия Apache 2.0 | CMake |
ннг | быстрая очередь сообщений, преемник nanomsg | ||
omniORB | — самая быстрая, полная и переносимая реализация CORBA ORB на C ++ | ||
OpenDDS | РеализацияDDS | ||
Paho MQTT | Современный клиент C ++ для MQTT от Eclipse | CMake | |
PcapPlusPlus | Мультиплатформенная структура C ++ для анализа сетей, синтаксического анализа и создания пакетов | ||
POCO | сеть: шифрование, HTTP; ZIP-файлы | ||
rest_rpc | современный, простой и легкий в использовании фреймворк rpc | CMake | |
restc-cpp | Упрощает доступ к JSON API из C ++.HTTP-клиент, собственный класс C ++ в / из сериализации JSON, асинхронный ввод-вывод через сопрограммы boost :: asio. С ++ 14. | Лицензия MIT | CMake |
restful_mapper | ORM для использования API RESTful JSON в C ++ | CMake, Makefile | |
морской звезд | Высокопроизводительный фреймворк серверных приложений, основанный на C ++ 14 / C ++ 17. | Apache License 2.0 | CMake и др. |
Простая библиотека REST C ++ | Очень простая и самодокументированная библиотека для создания REST API в вашем приложении C ++ | ||
sockpp | Простая современная библиотека сокетов C ++ | BSD с 3 пунктами «Новая» или «Пересмотренная» лицензия | CMake |
поток-клиент | Облегченный клиентский сокет / коннектор / пул сокетов / резольвер на основе только заголовков | Лицензия Apache 2.0 | CMake |
такопи | C ++ 11 Библиотека TCP | Лицензия MIT | CMake |
ТАО | CORBA | ||
taox11 | Реализация CORBA на основеC ++ 11 | Лицензия MIT | |
Веб-фреймворк Silicon C ++ 14 | Быстрые и надежные веб-API | MIT | |
Unicomm | асинхронная сеть, высокоуровневая структура связи TCP | ||
увв | обертка libuv в современном C ++ | Лицензия MIT | CMake |
wvstreams | |||
zeromq | очередь быстрых сообщений | ||
Библиотека | Описание | Лицензия | Конфигурация |
BlockingCollection | Поточно-безопасный класс коллекции C ++ 11, созданный по образцу.NET BlockingCollection. | ||
Boost.Atomic | |||
Boost.Compute | (неофициальные) STL-подобные алгоритмы и структуры данных для OpenCL | ||
Boost.Context | |||
Повышение между процессами | |||
Boost.Lockfree | |||
Boost.MPI | |||
Boost.Thread | |||
бедра | предоставляет набор инструментов на основе clang и реализацию SYCL во время выполнения, которая может работать на нескольких целевых устройствах (NVIDIA / AMD GPU, s CPU) | ||
л.с. | Среда выполнения C ++ общего назначения для параллельных и распределенных приложений любого масштаба | ||
Intel TBB | |||
КОККОС | Модель программирования на C ++ для написания высокопроизводительных портативных приложений HPC. | ||
libopenmpi | |||
libsimdpp | Переносимая низкоуровневая SIMD-библиотека C ++ с нулевыми накладными расходами только для заголовков. | Boost Лицензия | CMake |
MutexGear | Синхронизация только мьютекса (колесо, rwlock, рабочие очереди) | Лицензия библиотеки MutexGear | настроить, MSVC |
OpenMP | |||
RaftLib | поток C ++ как одновременные участники | ||
SObjectizer | Небольшая структура для упрощения разработки параллельных и событийно-управляемых приложений на C ++ с использованием моделей актора и публикации-подписки. | ||
подпроцесс | кроссплатформенная библиотека для запуска подпроцессов. | ||
Рабочий процесс | Программирование параллельных задач в современном C ++ | ||
Тяга | STL-подобные алгоритмы и структуры данных для CUDA | ||
VexCL | Библиотека шаблонов выражений C ++для OpenCL и CUDA | ||
ВенаCL | Линейная алгебра и алгоритмы с бэкэндами OpenMP, CUDA и OpenCL | ||
Xenium | Библиотека только для заголовков, обеспечивающая различные параллельные структуры данных и схемы восстановления. | ||
Библиотека | Описание | Лицензия | Конфигурация |
AI-XML | Сериализуйте объекты в и из XML, добавив в класс одну минимальную функцию. Использует libxml ++ под капотом. | ||
GPDS | Сериализатор данных общего назначения для сериализации объектов в XML и обратно. Использует TinyXML под капотом. | ||
gSOAP | привязки данных XML | ||
libxml ++ | |||
pugixml | |||
tinyxml | |||
tinyxml2 | Другой и незавершенный TinyXML. | ||
Xerces | |||
Библиотека | Описание | Лицензия | Конфигурация |
ArduinoJson | ArduinoJson | ||
КАДЖУН | |||
jansson | Jansson — это библиотека C для кодирования, декодирования и управления данными JSON. | ||
jeayeson | Очень разумная (только заголовок) библиотека C ++ 14 JSON | ||
jios (потоки ввода-вывода JSON) | |||
JOST | |||
JSON Вурхиз | Killer JSON для C ++ | ||
json | Нильс Ломанн JSON | ||
JSON ++ | |||
json-cpp | |||
json11 | json11 — это крошечная библиотека JSON для C ++ 11, обеспечивающая анализ и сериализацию JSON. | ||
JsonBox | |||
jsoncons | Библиотека только для заголовков для форматов данных JSON и JSON с указателем JSON, патчем JSON, JSONPath, CSV, MessagePack, CBOR, BSON, UBJSON. | ||
jsoncpp | |||
jsonme— | |||
libjson | |||
minijson | C ++ Разбор и сериализация JSON без DOM и без выделения памяти | ||
без дрочки | |||
qjson | |||
rapidjson | |||
simdjson | Разбор гигабайт JSON в секунду | ||
struct_mapping | Отображение json в структуру c ++ и обратно | ||
ThorsSerializer (потоки ввода-вывода JSON / YAML) | |||
ujson | µjson — небольшая библиотека C ++ 11, UTF-8, JSON. | ||
зоолиб | |||
Библиотека | Описание | Лицензия | Конфигурация |
томл ++ | Парсер и сериализатор TOML для C ++ 17 и новее | ||
toml11 | Библиотека парсингаTOML на основе C ++ 11 | ||
Библиотека | Описание | Лицензия | Конфигурация |
cpp-hocon | Реализация C ++ формата HOCON, разработанная Pupplet. | ||
Библиотека | Описание | Лицензия | Конфигурация |
Boost.Любое | |||
Boost.Array | |||
Boost.Bimap | |||
Boost.Container | |||
Boost.Fusion | |||
Boost.Heap | |||
Контейнер Boost.Pointer | |||
Boost.Tuple | |||
Boost.Variant | |||
cpp-btree | btree_map, btree_set, btree_multimap, btree_multiset. | ||
DataFrame | C ++ DataFrame для статистического, финансового и машинного анализа — в современном C ++ с использованием собственных типов, непрерывного хранения в памяти и без использования указателей | BSD-3-Пункт | CMake, Makefile, Конан |
яиц :: вариант | Eggs.Variant — это универсальное типобезопасное, размеченное объединение C ++ 11/14. Он примечателен, в частности, очень хорошей поддержкой constexpr. | ||
Замороженный | constexpr замороженные наборы и карты на основе идеального хеширования | Apache 2.0 | |
plf :: колония | Неупорядоченный контейнер типа «мешок», который превосходит std :: container в сценариях с высокой степенью модификации, сохраняя действительные указатели на нестертые элементы независимо от вставки и стирания. | ||
plf :: список | Реализацияstd :: list, которая жертвует объединением диапазонов ради удобства кеширования, обеспечивая более быструю вставку, стирание и итерацию. | ||
plf :: stack | Вставляемый замещающий контейнер для адаптера контейнера std :: stack с лучшей производительностью, чем std :: vector и std :: deque в контексте стека. | ||
ring_span | Упрощенная реализация ring_span Артура О’Двайера — т.е. круговой буферный вид. | ||
strict_variant | Быстрый, никогда не пустой вариант, ориентированный на C ++ 11.Предотвращает многие нежелательные неявные преобразования. | ||
TdhСписки | |||
Игг | Навязчивая реализация C ++ 11 высокопроизводительных контейнеров и структур данных, таких как красно-черное дерево, дерево интервалов и карта интервалов. | ||
Библиотека | Описание | Лицензия | Конфигурация |
cpp-redis | C ++ 11 Легкий клиент Redis: асинхронный, поточно-ориентированный, без зависимостей, конвейерная обработка, мультиплатформенность. | ||
DTL | |||
EasyQtSql | Облегченная библиотека C ++ 11 только для заголовков для быстрого и простого выполнения запросов SQL с помощью QtSql. | ||
LevelDB | Библиотека C ++, разработанная Google, которая поддерживает постоянное хранение данных типа «ключ-значение» в миллиардном масштабе. | ||
libpqxx | |||
lmdb ++ | C ++ 11 оболочка для встроенной библиотеки базы данных B + tree LMDB. | ||
mongocxx | Библиотека драйверовC ++ 11 для MongoDB | ||
MySQL ++ | |||
ODB — объектно-реляционное сопоставление C ++ (ORM) | |||
OTL | |||
Pgfe — PostGres FrontEnd | Современный клиентский API C ++ для PostgreSQL | ||
QTL | Дружественная и легкая библиотека баз данных C ++ для MySQL, SQLite и ODBC. | ||
АЙВА: ЗАПРОСЫ В ВЫРАЖЕНИЯХ C ++ (ORM + EDSL) | |||
QxOrm — объектно-реляционное сопоставление (ORM) C ++ Qt | |||
редис-cpp | C ++ 17 Облегченная клиентская библиотека C ++, предназначенная только для заголовков, для выполнения команд Redis. | ||
редис-плюс-плюс | Клиент Redis, написанный на C ++ 11 и поддерживающий Redis Sentinel, Redis Cluster, конвейер, транзакцию, pubsub, пул соединений и интерфейс, подобный STL. | ||
СОЦИ | |||
SQLAPI ++ | |||
SQLiteCPP | |||
sqlpp11 | |||
Библиотека | Описание | Лицензия | Конфигурация |
искажений | объектно-ориентированная ОСРВ на C ++ для микроконтроллеров | ||
ETL — встроенная библиотека шаблонов | C ++ 03, Переносимая библиотека шаблонов для платформ с низким уровнем ресурсов | ||
QP / C ++ | ЯдроRTOS, двойная GPL | ||
мкКУРЕСТ | C ++ 11 серверная среда REST / JSON для микроконтроллеров | ||
Библиотека | Описание | Лицензия | Конфигурация |
DataFrame | C ++ DataFrame для статистического, финансового и машинного анализа — в современном C ++ с использованием собственных типов, непрерывного хранения в памяти и без использования указателей | BSD-3-Пункт | CMake, Makefile, Конан |
QuantLib — Библиотека количественных финансов | |||
Библиотека | Описание | Лицензия | Конфигурация |
Кигс-каркас | Модульная многоцелевая кроссплатформенная платформа | лицензия MIT | |
openFrameworks | |||
SDL (простой уровень DirectMedia) | кроссплатформенный, низкоуровневый доступ к аудио, клавиатуре, мыши, джойстику и графическому оборудованию через графический API этой платформы (обычно OpenGL или Direct3D) | zlib лицензия | |
SFML (простая и быстрая мультимедийная библиотека) | |||
SIGIL (Библиотека интеграции звука, ввода и графики) | ошеломляюще простая кроссплатформенная минималистичная библиотека для текста, фигур, ввода, звука и 2D-изображений | ||
Библиотека | Описание | Лицензия | Конфигурация |
Abseil | Коллекция кода библиотеки C ++ с открытым исходным кодом от Google, предназначенная для расширения стандартной библиотеки C ++. | ||
Абстрактные интрузивные контейнеры | Более гибкий, чем boost :: навязчивый, но не совместимый со STL. | ||
BDE | Основные библиотеки среды разработки Bloomberg от Bloomberg L.P. | Лицензия Apache | |
Лучшее перечисление | Отражающие перечисления (перечисление в строку, итерацию и т. Д.) С поддержкой constexpr. | Лицензия BSD | |
bitfield.h | Битовая структура поля, более портативная / гибкая, чем функция базового языка. | ||
Boost | большая коллекция универсальных библиотек | Boost Лицензия | |
CAF | C ++ Actor Framework (CAF) — это реализация модели акторов C ++ 11 с открытым исходным кодом, включающая легкие и быстрые реализации акторов, сопоставление шаблонов для сообщений, прозрачный сетевой обмен сообщениями и многое другое. | Лицензия BSD | |
Cinder | |||
CommonPP | Многоцелевая библиотека с упором на получение метрик из проекта. | Лицензия BSD | |
Composite_op.h | Базовый самоанализ данных класса, громоздкий и часто не реентерабельный, но иногда полезный. | ||
спз-ммф | Библиотека C ++ 98, которая инкапсулирует файлы с отображением памяти для POSIX или Windows. | ||
cxxomfort | Backports функций C ++ (предложения от C ++ 11 до C ++ 03 и от C ++ 1y до C ++ 11 / C ++ 03). | ||
Длиб | сети, потоки, графические интерфейсы, структуры данных, линейная алгебра, машинное обучение, XML и анализ текста, численная оптимизация, байесовские сети и множество других задач | Boost Лицензия | |
куб. | Freundlich’s C ++ Toolkit (fcppt) — это набор библиотек, направленных на улучшение общего кода C ++ путем предоставления более совершенных типов и использования функционального программирования. | ||
Безумие | Библиотека с открытым исходным кодом Facebook. Библиотека компонентов C ++ 11 разработана с учетом практичности и эффективности. | ||
GSL | Guidelines Поддержка реализации библиотеки, рекомендованная Bjarne Stroustrup, Herb Sutter и Co в C ++ Core Guidelines | ||
gsl-lite | Версия библиотеки поддержки рекомендаций ISO C ++ (GSL) для C ++ 98, C ++ 11 и более поздних версий, содержащая только заголовок. | Лицензия MIT | |
СОК | Обширный зрелый кроссплатформенный инструментарий C ++ | ЛицензияGPL | |
Кангару | Контейнер внедрения зависимостей для C ++ 11 и C ++ 14 | Лицензия MIT | |
библиотек | Кросс-платформенная библиотека C ++ 11 для высокоскоростной работы в сети и кодирования мультимедиа.HTTP, WebSockets, TURN, STUN, Symple и другие … | ||
Локи | паттернов проектирования | ||
nonstd-lite | Родитель репозиториев * -lite, путь миграции к функциям, вышедшим после C ++ 11, для сред до C ++ 11 | Boost Лицензия | |
ньютл | Универсальная библиотека служебных шаблонов C ++ 17, предназначенная только для заголовков. | Boost Лицензия | |
OnPosix | Библиотека C ++, предоставляющая несколько абстракций (например,g., многопоточность, сеть, ведение журнала, IPC и т. д.) на платформах POSIX. | ||
Причина | xml, xpath, регулярное выражение, потоки, сокеты, http, sql, дата-время, потоки, кодирование и декодирование, файловая система, сжатие | ЛицензияGPL | |
SaferCPlusPlus | SaferCPlusPlus — Безопасные совместимые заменители небезопасных примитивов C ++, включая указатели, int и std :: vector. | Boost Лицензия | |
Smart Enum | «to_string», «from_string» и другие для ваших перечислений. | Boost Лицензия | |
Ultimate ++ | Кросс-платформенная среда быстрой разработки приложений | ||
единиц | Библиотека анализа измерений и преобразования единиц измерения, используемая только для заголовков, времени компиляции и преобразования единиц, построенная на C ++ 14 без зависимостей. | Лицензия MIT | |
яал | , коллекции, вычисление произвольной точности, синтаксические анализаторы, управляемые грамматикой общего DSL, и многое другое (CC BY-ND-NC 4.0) | ||
Ято | Modern C ++ (14/17) кроссплатформенная библиотека в стиле STL и совместимая с STL с реализацией контейнеров, диапазонов, итераторов, свойств типов и других инструментов; система актеров; безопасный интерфейс конфигурации. | Apache-2.0 | |
йомм2 | Открытые мульти-методы для C ++ 17 | Boost Лицензия | |
Библиотека | Описание | Лицензия | Конфигурация |
Уважаемый ImGui | Библиотека графического пользовательского интерфейса без лишних слов, которая оптимизирована. | ||
ФЛТК | |||
нана | Программирование графического интерфейса в современном стиле C ++ | Boost Лицензия | |
наногуи | Минималистичная кроссплатформенная библиотека виджетов для OpenGL 3.x или выше | ||
OWLследующий | Современное обновление OWL для написания приложений с графическим интерфейсом на стандартном C ++ в Windows | ||
крошечных файловых диалогов | — один кроссплатформенный файл C C ++ (без инициализации, без основного цикла, 6 модальных вызовов функций) | ||
WxWidgets | |||
Библиотека | Описание | Лицензия | Конфигурация |
Медь, Специя | CopperSpice — это набор библиотек C ++, используемых для разработки кроссплатформенных программных приложений.Он выпущен под лицензией LGPL V2.1. Он использует современный идиоматический C ++ и легко интегрируется с STL. CopperSpice был получен из фреймворка Qt. | ||
CsSignal | Автономная библиотека сигналов / слотов с поддержкой потоков C ++ | ||
CsString | Автономная библиотека строк C ++ с поддержкой Unicode | ||
libGuarded | Автономная многопоточная библиотека C ++ для управления доступом к общим данным | ||
Библиотека | Описание | Лицензия | Конфигурация |
bgfx | Мощная кроссплатформенная библиотека рендеринга графики, поддерживаемые платформы включают Windows Mac Linux iOS Android Web, бэкэнд рендеринга, включая DX, opengl, metal webgl и так далее. | ||
каиромм | |||
кадров в секунду | 2D, 3D и изометрический программный рендерер с набором инструментов графического интерфейса для рабочего стола, минималистичная зависимость, рассчитана на длительное обслуживание и может работать без каких-либо 3D-ускоренных драйверов | zlib лицензия | |
гегл | |||
нановг | Библиотека 2D-чертежей на основе openGL / DX / metal. | ||
нукс | |||
пангомм | |||
Библиотека | Описание | Лицензия | Конфигурация |
Adobe / boost GIL | универсальная библиотека высокого уровня, ориентированная на алгоритмы, работающие с 2D-изображениями. Очень ограниченные возможности ввода-вывода. | ||
Anti-Grain Evolution | Кросс-платформенный механизм 2D-растеризации и рендеринга|||
ГрафикаMagick | Чтение, запись и обработка изображений в более чем 88 основных форматах.Разветвлен от ImageMagick в 2002 году | ||
Skia | Основная графическая библиотека Google по состоянию на 2005 год, используемая в Chrome, Chrome OS, Android, а также в Firefox и Sublime Text enwiki: Skia_Graphics_Engine | ||
стб | |||
Библиотека | Описание | Лицензия | Конфигурация |
ассимп | Загрузка 3D-модели | ||
bgfx | Кроссплатформенный, независимый от графического API, библиотека рендеринга стиля «Bring Your Own Engine / Framework». | ||
Diligent Engine | Современная кроссплатформенная библиотека низкоуровневой трехмерной графики. | ||
Bertrand
Обработка изображений и, в частности, изменение размера изображений, является общим требованием для веб-приложений. Таким образом, я хотел нарисовать панораму возможностей, которые существуют для .NET Core для обработки изображений. Для каждого варианта я дам образец кода для изменения размера изображения и выделю интересные функции. В заключение я приведу сравнение производительности библиотек с точки зрения скорости, размера и качества вывода.
Если у вас есть существующий код, основанный на System.Drawing
, использование этой библиотеки, несомненно, является вашим самым быстрым путем к .NET Core и кроссплатформенному блаженству: производительность и качество в порядке, а API точно такой же . Встроенные API System.Drawing
— это самый простой способ обработки изображений с помощью .NET Framework, но они полагаются на функции GDI + из Windows, которые не включены в .NET Core, и являются клиентской технологией, которая никогда не была разработана. для многопоточных серверных сред.Существуют проблемы с блокировкой, которые могут сделать это решение непригодным для ваших приложений.
CoreCompat.System.Drawing
— это порт .NET Core для реализации Mono System.Drawing
. Подобно System.Drawing
в .NET Framework и Mono, CoreCompat.System.Drawing
также полагается на GDI + в Windows. Поэтому рекомендуется соблюдать осторожность по тем же причинам.
Также будьте осторожны при использовании кроссплатформенной библиотеки, чтобы включить среду выполнения.Пакеты osx.10.10-x64.CoreCompat.System.Drawing и / или runtime.linux-x64.CoreCompat.System.Drawing.
ImageSharp — это совершенно новая библиотека с полностью управляемым кодом и кроссплатформенной обработкой изображений. Его производительность не так хороша, как у библиотек, зависящих от собственных зависимостей ОС, но она остается очень разумной. Его единственная зависимость — это сам .NET, что делает его чрезвычайно портативным: нет дополнительных пакетов для установки, просто обратитесь к самому ImageSharp, и все готово.
Если вы решите использовать ImageSharp, не включайте пакет, который отображается в NuGet: он будет пустым заполнителем до выхода первого официального выпуска ImageSharp. На данный момент вам нужно получать еженощную сборку из ленты MyGet. Это можно сделать, добавив следующий NuGet.config
в корневой каталог проекта:
Изменить размер изображения с помощью ImageSharp очень просто.
Для новой кодовой базы библиотека на удивление завершена. Он включает в себя все фильтры, которые вы ожидаете от обработки изображений, и даже включает в себя всестороннюю поддержку чтения и записи тегов EXIF (этот код используется совместно с Magick.NET):
Обратите внимание, что последние сборки ImageSharp более модульны, чем раньше, и если вы собираетесь использовать форматы изображений, такие как Jpeg, или возможности обработки изображений, такие как Resize
, вам необходимо импортировать дополнительные пакеты. в дополнение к основному пакету ImageSharp (соответственно ImageSharp.Processing
и ImageSharp.Formats.Jpeg
).
Magick.NET — это .NET-оболочка для популярной библиотеки ImageMagick. ImageMagick — это кроссплатформенная библиотека с открытым исходным кодом, которая фокусируется на качестве изображения и предлагает очень широкий выбор поддерживаемых форматов изображений.Он также поддерживает EXIF так же, как ImageSharp.
Сборка Magick.NET .NET Core в настоящее время поддерживает только Windows. Автору библиотеки Дирку Лемстре нужна помощь в преобразовании сценариев сборки для собственной зависимости ImageMagick, поэтому, если у вас есть опыт создания собственных библиотек на Mac или Linux, это отличная возможность помочь в отличном проекте.
Magick.NET имеет лучшее качество изображения из всех библиотек, обсуждаемых в этом посте, как вы можете видеть в примерах ниже, и работает относительно хорошо.Он также имеет очень полный API и лучшую поддержку экзотических форматов файлов.
SkiaSharp — это .NET-оболочка для кроссплатформенной библиотеки 2D-графики Google Skia, которая поддерживается командой Xamarin. SkiaSharp теперь совместим с .NET Core и работает очень быстро. Поскольку он полагается на собственные библиотеки, его установка может быть сложной, но я смог легко заставить его работать в Windows и macOS. В настоящее время Linux представляет собой более сложную задачу, поскольку необходимо создавать некоторые собственные библиотеки из кода, но команда работает над устранением этих препятствий, поэтому SkiaSharp скоро станет очень интересным вариантом.
Эта библиотека для собственной библиотеки FreeImage является тем же, чем Magick.NET для ImageMagick: оболочкой .NET Core. Он предлагает хороший выбор форматов изображений, хорошую производительность и хорошее визуальное качество. Однако кроссплатформенная поддержка на данный момент не идеальна, поскольку мне не удалось сохранить изображения на диск в Linux и macOS. Надеюсь, это скоро будет исправлено.
MagicScaler — это библиотека для Windows, которая использует компоненты Windows Image Components (WIC) для обработки изображений, но применяет собственные алгоритмы для очень высококачественной передискретизации.Это не универсальная 2D-библиотека, она предназначена исключительно для изменения размера изображений. Как вы можете видеть в галерее ниже, результаты впечатляют: библиотека работает очень быстро и обеспечивает беспрецедентное качество. Отсутствие кроссплатформенной поддержки станет препятствием для многих приложений, но если вы можете позволить себе работать только в Windows и вам нужно только изменить размер изображения, это отличный выбор.
Первый тест загружает, изменяет размер и сохраняет изображения на диск в формате Jpeg с качеством 75.Я использовал 12 изображений с большим разнообразием предметов и деталей, размер которых не так легко изменить, чтобы легко заметить дефекты. Изображения примерно в один мегапиксель в формате JPEG, за исключением одного изображения, которое немного меньше. Ваш опыт может варьироваться в зависимости от того, с каким типом изображения вам нужно работать. Я бы рекомендовал вам попытаться воспроизвести эти результаты с образцом изображений, которые соответствуют вашему собственному сценарию использования.
Для второго теста размер пустого мегапиксельного изображения изменяется до миниатюрного изображения шириной 150 пикселей без доступа к диску.
В тестах используется .NET Core 1.0.3 (последняя версия LTS на данный момент) для CoreCompat.System.Drawing
, ImageSharp и Magick.NET и Mono 4.6.2 для SkiaSharp.
Я провел тесты в Windows на рабочей станции HP Z420 с четырехъядерным процессором Xeon E5-1620, 16 ГБ оперативной памяти и встроенным графическим процессором Radeon. Для Linux результаты относятся к той же машине, что и Windows, но для виртуальной машины 4 ГБ, поэтому более низкая производительность ничего не значит относительно производительности Windows и Linux, и только сравнение библиотеки с библиотекой следует считать значимым.Номера macOS указаны на iMac с процессором Core i5 1,4 ГГц, 8 ГБ ОЗУ и встроенным графическим процессором Intel HD Graphics 5000, работающим под управлением macOS Sierra.
Результаты будут существенно различаться в зависимости от оборудования: использование и производительность графического процессора и SIMD зависит как от того, что доступно на машине, так и от использования библиотеки. Разработчики, желающие получить максимальную производительность, должны продолжить эксперименты. Следует упомянуть, что мне пришлось отключить OpenCL на Magick.NET ( OpenCL.IsEnabled = false;
), так как на этой рабочей станции у меня была значительно худшая производительность, чем на моем ноутбуке.
Библиотека | Загрузка, изменение размера, сохранение (мс на изображение) | Изменение размера (мс на изображение) |
---|---|---|
CoreCompat.System.Drawing | 34 ± 1 | 16,0 ± 0,6 |
ImageSharp | 45 ± 1 | 10,1 ± 0,2 |
Магия.NET | 56 ± 2 | 24,1 ± 0,3 |
SkiaSharp | 20 ± 1 | 7,8 ± 0,1 |
FreeImage | 39 ± 1 | 12,9 ± 0,1 |
MagicScaler | 20 ± 1 | н / д |
Для обоих показателей чем ниже, тем лучше.
Библиотека | Загрузка, изменение размера, сохранение (мс на изображение) | Изменение размера (мс на изображение) |
---|---|---|
CoreCompat.System.Drawing | 93 ± 1 | 71,5 ± 0,3 |
ImageSharp | 70,3 ± 0,3 | 27,6 ± 0,2 |
SkiaSharp | 15,9 ± 0,1 | 7,6 ± 0,1 |
FreeImage | н / д | 12,8 ± 0,1 |
Для обоих показателей чем ниже, тем лучше.
Библиотека | Загрузка, изменение размера, сохранение (мс на изображение) | Изменение размера (мс на изображение) |
---|---|---|
CoreCompat.System.Drawing | 114 ± 5 | 92 ± 1 |
ImageSharp | 384 ± 5 | 128 ± 1 |
FreeImage | нет данных | 29,7 ± 2 |
Для обоих метрики, чем ниже, тем лучше.
Библиотека | Размер файла (в среднем, кБ на изображение) |
---|---|
CoreCompat.System.Drawing | 4.0 |
ImageSharp | 4.0 |
Magick.NET | 4,2 |
SkiaSharp | 3,6 |
FreeImage | 3,6 |
MagicScaler | 4,3 |
Чем меньше, тем лучше. Обратите внимание, что на размер файла влияет качество выполняемой подвыборки, поэтому при сравнении размеров следует учитывать визуальное качество конечного результата.
Вот изображения с измененным размером.Как видите, качество сильно различается от изображения к изображению и от библиотек. Некоторые изображения демонстрируют резкую разницу в резкости, а некоторые эффекты муара видны местами. Вы должны сделать выбор, исходя из ограничений вашего проекта и компромисса между производительностью и качеством, на который вы готовы пойти.
Сегодня существует хороший выбор библиотек для обработки изображений в .NET Core, которые могут соответствовать различным требованиям, и в ближайшем будущем появятся еще более интересные варианты.
Если производительность является вашим приоритетом, CoreCompat.System.Drawing — хороший выбор сегодня, если возможные проблемы с блокировкой в сценариях сервера Windows не являются препятствием для вашего приложения. SkiaSharp, когда будут решены проблемы с установкой Linux, станет фантастическим выбором, обеспечивающим производительность без ущерба для качества.
Если качество является вашим главным приоритетом и вы можете работать только в Windows, MagicScaler — это фантастика, без ущерба для производительности.
Если поддержка типов файлов является вашим приоритетом, Magick.NET — победитель. Однако кроссплатформенной поддержки пока нет, но вы можете помочь.
Наконец, единственная доступная на данный момент библиотека чистого управляемого кода, ImageSharp, является отличным выбором. Его производительность близка к производительности Magick.NET, а тот факт, что он не имеет собственных зависимостей, означает, что библиотека гарантированно будет работать везде, где работает .NET Core. Библиотека все еще находится на стадии альфа-тестирования, и ожидаются значительные улучшения производительности, в частности, с будущим использованием Span
и возвращений ref.
Все четыре библиотеки в этом посте имеют открытый исходный код и существуют только благодаря таланту и щедрости их авторов, участников и сопровождающих. В частности,
Мой пример кода можно найти на GitHub. В репозиторий включены образцы изображений, которые я использовал в этой публикации.
ОБНОВЛЕНИЕ 20.01.2017, 11:09 PST: обновление ImageSharp до последней ежедневной сборки (1.0.0-alpha1-00053) значительно улучшило качество вывода.
ОБНОВЛЕНИЕ 14.02.2017: все библиотеки обновлены до последней версии, SkiaSharp запущен на .NET Core вместо Mono, обновлен образец кода для повышения качества, добавлены библиотеки FreeImage и MagicScaler, повторно выполнены все тесты.
ОБНОВЛЕНИЕ 2/16/2017: исправлена аномалия в производительности Magick.NET Windows.
.