8-900-374-94-44
[email protected]
Slide Image
Меню

Библиотеки для работы с изображениями c: 1 место — Библиотека Magick.NET C# (Image Magick), работа с изображениями, и другие полезняшки. | ZennoLab

Содержание

13 библиотек С++, о которых нужно знать

Помимо стандартной библиотеки, содержащей основные модули языка С++, разработаны десятки, а то и сотни дополнительных библиотек. Каждая из этих библиотек содержит программы и подпрограммы, производящие ряд действий.

Использование сторонних библиотек сокращает объём кода и оптимизирует работу программы, поскольку решения, использован  ные разработчиками библиотеки и оттестированные сотнями программистов в разноплановых проектах, после нескольких лет шлифовки достигают лучших показателей по всем параметрам.

Знание и использование ряда полезных библиотек сильно упрощает работу программиста. По этому признаку работодатели легко отличают уверенного профессионала от неопытного новичка.

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

Веб-разработка

V8

Картинки по запросу библиотека v8 логотип

Если Вам нужен удобный инструмент для работы с JavaScript, V8 подойдёт идеально.

Свои функции V8 реализует, используя специальные классы, написанные на с++ и объявленные в namespace V8. Работать с джава скрипт — структурами можно через привычную оболочку с++.

Схема взаимодействия объектов с++ и V8 реализована посредством использования  v8::Handle (template-классов).

Установка V8 обычно не занимает много времени, а польза для тех, кому периодически приходится работать с JavaScript’ом, неоценима.

Кроме того, о библиотеках, с помощью которых могут взаимодействовать C++ и JavaScript очень любят спрашивать на собеседованиях. Поэтому даже, если вы не собираетесь работать с js , с V8 или другими подобными библиотеками лучше познакомиться.

WebKit

 

Так или иначе, почти все разработчики на разных этапах сталкиваются с необходимостью отображать web – элементы. Чтобы всё выглядело красиво и в коде, и в конечном отображении, а выполнение этой задачи не отнимало слишком много времени и сил, существует библиотека WebKit.

Некоторые программисты называют WebKit «чёрным ящиком», органично перерабатывающим html, css и JavaScript в полноценные веб-страницы.

Awesomium

Awesomium — это библиотека для интеграции браузера (на базе Chromium) в своё приложение. Библиотека имеет 2 режима работы: Offscreen и Windowed.

В режиме Offscreen отрисовка  и работа скриптов на экране не отображается.

В режиме Windowed средствами библиотеки эффективно выполняется отрисовка в «окне приписки» и обработка активности мыши и клавиатуры.

Awesomium активно применяется в десятках разных приложений. Описаны случаи интеграции этой библиотеки в 3D игры.

Существенный минус – отсутствие активного сообщества, способного познакомить новичка с библиотекой, ответить на вопросы и исправить ошибки. А документация, доступная для работы с Awesomium на с++, даёт довольно смутное представление о принципах работы библиотеки.

Тем не менее, Awesomium остаётся очень удобным инструментом, завоевавшим признание сотен разработчиков по всему миру.

Работа с сервером

Libcurl

Curl-logo.svg

Хотите упростить взаимодействие с сервером? – используйте Libcurl.

Libcurl помогает передавать данные (изображения, файлы и пр.) приложениям. Libcurl поддерживает 13 основных протоколов FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP.

Изначально cUrl предназначался для использования на языке С. Сейчас для работы с Libcurl разработаны модули интеграции к 30 языкам программирования. Что говорит о высокой популярности библиотеки в среде разработчиков. На это же указывает высокий рейтинг продукта.  

Сжатие данных

Библиотек для сжатия данных довольно много, одна из самых удобных и популярных

Zlib

Zlib 3D green.png

Сжатие любых объёмов данных (даже превышающих объём памяти) с помощью zlib проводится предельно легко.

Zlib написана на языке С и применяется в тысячах проектов. Использование некоторых других библиотек невозможно без использования zlib. Примером такой библиотеки является основная  библиотека для работы с растровой графикой в формате .png  — libpng.

Работа с изображениями

Libpng и libjpg

Картинки по запросу LIBPNG логотип

Libpng, написанная на C с использованием ассемблера, предназначена для работы с изображениями в формате .png.

Для работы с изображениями в формате .jpg существует библиотека  libjpg (также написанная на С с использованием Ассемблера)

Картинки по запросу LIBJPEG логотип

Обе библиотеки имеют подробные инструкции и множество примеров использования как в С, так и в С++.

Работа с PDF

Периодически возникает необходимость конвертировать файлы в формат pdf. Для этого процесса разработана динамическая библиотека DynaPDF.

DynaPDF

Картинки по запросу библиотека DYnaPDF логотип

DynaPDF – удобный гибкий инструмент. Формат .dll хотя и открывает достаточно широкие возможности, периодически становится причиной возникновения ошибок.

Для успешного устранения ошибок в сети есть много пошаговых инструкций.

Используется для программирования на языках C/C++, C#, Delphi, Lazarus, PHP, VB, VBA, and VB .Net.

Работа с базами данных

Большая часть приложений нуждается во взаимодействии с базами данных. Оттуда получаются и туда передаются потоки необходимой информации. Поэтому  большинство работодателей интересует умение соискателей работать с базами данных.

Libpq

Картинки по запросу libpq логотип

Libpq – удобная библиотека для взаимодействия С и PosgreSQL. Благодаря ей из кода С можно вносить изменения в базу данных, добавлять и безвозвратно удалять данные, создавать и удалять таблицы.

Существуют вариации libpq для C++, Python’a, Perl’a, Tcl, ECPG.

Отладка и тестирование

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

Check

Библиотека Check предназначена для модульного тестирования всех возможностей программ, написанных на языке С. Существенным плюсом использования Check’а служит возможность запуска тестов в отдельных процессах для более точной диагностики причин возникновения ошибок, снижения скорости и т.п

Для модульного тестирования на языке С++ используется Google C++ Testing Framework (Google Test).

 

Pcap

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

Pcap предназначена для работы с С и С++. Существуют обёртки, делающие эту библиотеку доступной для работы на других языках программирования.

Ещё Вам может пригодиться…

Libusb

Картинки по запросу LibUSB логотип

Libusb — это библиотека, которая позволяет обмениваться данными с USB-устройствами прямо из кода программы.

В библиотеке поддерживаются все типы передачи (управление / объем / прерывание / изохронность). Важный элемент библиотеки – журнал сообщений. Он помогает правильно расшифровать коды ошибок, поступающие от USB- устройств.

Предназначена для работы с С. Для других языков программирования разработаны обёртки. Для С++ —  Libusbpp

ZBar

Картинки по запросу ZBar логотип

Библиотека ZBar предназначена для распознавания штрихкодов из изображений.

ZBar имеет предельно простую и логичную документацию без «тёмной магии» и необъяснимых функций.

Работать с ней легко и удобно. Можно использовать из программных интерфейсов С, С++, Питона и других языков программирования.

Заключение

Большинство описанных библиотек работают и под Windows, и под Linux, и под macOS, и под BSD. Разработчики библиотек предоставляют подробную техническую документацию, а комьюнити готово поделиться пошаговыми инструкциями по установке и ответить на любые рабочие вопросы.

Умение работать с библиотеками – важный навык для любого программиста. Это своеобразный показатель его профессионального уровня и понимания процесса разработки.

Библиотеки помогают решить множество сложных задач, возникающих при разработке кода. Чем теснее Вы с ними «подружитесь», тем шире будет круг ваших профессиональных возможностей.

Не бойтесь новых задач – ищите их решение.

Пишите код, тестируйте и оттачивайте его до блеска. А команда progtips.ru всегда придёт Вам на помощь!

АНОНС

Вы думаете, это все полезные библиотеки? Нет! На десерт мы оставили самое интересное.

В следующем выпуске Вас ждут:

— лучшие графические библиотеки для С++;

— чем пользуются разработчики компьютерных игр в России и на Западе;

и как по графической библиотеке отличить любителя от профессионала.

Похожие записи:

Библиотека libxml2 для работы с XML-файлами

Рисуем фракталы с помощью PHP и Cairo. Часть 3. Фракталы на комплексной плоскости

Библиотеки для 2D рисования на C/C++

Ниже рассмотрены библиотеки на C/C++, которые могут быть использованы в основе разработки библиотеки для генерации 2D финансовых графиков и индикаторов технического анализа.

Основными требованиями являются:

  • Наличие C/C++ API.
  • Наличие адекватной документации с примерами.
  • Наличие Python-пакета для экспериментов.
  • Относительно высокая скорость работы Python-пакета при рисовании >30000 линий.
  • Правильная работа со шрифтами, поддержка пиксельных шрифтов и возможность отключения сглаживания.

Итог к рассмотрению:

  • Pillow для работы в Python — быстрый, наличие документации.
  • gMagick++ или Magick++ для расширения C/C++ — быстрые, хорошо документированы на сайте ImageMagick.
  • SKIA или Cairo для работы с векторной графикой.

GraphicsMagic (Magick++)

Расширение для 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++).

ImageMagick (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). Не удалось решить проблемы со шрифтами (добавляет сглаживание и размытие).

Cairo

Библиотека написанная на C для рендеринга векторной графики. Содержит функции для рисования двумерных изображений. Преимуществом отмечается (на форумах) хорошая документация. Работает медленнее SKIA (есть сравнение в интернете).

Сайт: https://www.cairographics.org/
Примеры: https://www.cairographics.org/samples/

Расширение для C++: https://www.cairographics.org/cairomm/
Расширение для Python: http://pythonhosted.org/cairocffi/

SKIA

Графическая библиотека написанная на 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

AGG (Anti-Grain)

Библиотека растровой графики написанная на C++. Последняя версия выпущена в 2006 году. Есть предположение, что данная библиотека лежит в основе PIL для Python (и Pillow).

Сайт: http://www.antigrain.com/

GD

Библиотека для работы с растровой графикой написанная на C. Популярна в PHP. В Python с похожим функционалом доступен пакет Pillow, который и рекомендуется использовать.

Сайт: https://libgd.github.io/
Примеры: https://libgd.github.io/pages/faq.html

Расширение для Python: https://github.com/Solomoriah/gdmodule

Pillow (Python-пакет)

Форк стандартной библиотеки 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

Facebook

Twitter

Работа с изображениями на Python

Тема сегодняшнего разговора — чему же научился Python за все годы своего существования в работе с изображениями. И действительно, кроме старичков родом из 1990 года ImageMagick и GraphicsMagick, есть современные эффективные библиотеки. Например, Pillow и более производительная Pillow-SIMD. Их активный разработчик Александр Карпинский (homm) на MoscowPython сравнил разные библиотеки для работы с изображениями на Python, представил бенчмарки и рассказал о неочевидных особенностях, которых всегда хватает. В этой статье расшифровка доклада, который поможет вам выбрать библиотеку под свое приложение, и сделать так, чтобы она работало максимально эффективно.


О спикере: Александр Карпинский работает в компании Uploadcare и занимается сервисом быстрой модификации изображений на лету. Участвует в разработке Pillow — популярной библиотеки для работы с изображениями на Python, развивает собственный форк этой библиотеки — Pillow-SIMD, который использует современные инструкции процессоров для наибольшей производительности.

Бэкграунд


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

Весь сервис можно описать как обертку вокруг графической библиотеки. Именно от качества, производительности и удобства использования графической библиотеки зависит качество всего проекта. Несложно догадаться, что в качестве графической библиотеки в Uploadcare используется Pillow.

Библиотеки


Кратко рассмотрим, какие вообще есть в Python библиотеки для работы с графикой, чтобы лучше понимать, о чем пойдет речь далее.

Pillow


Pillow — форк PIL (Python Imaging Library). Это очень старый проект, вышедший в 1995 году для Python 1.2. Можно представить, насколько он старый! В какой-то момент Python Imaging Library была заброшена, ее разработка прекратилась. Форк Pillow был сделан для того, чтобы устанавливать и собирать Python Imaging Library на современных системах. Постепенно количество изменений, которые нужны были людям в Python Imaging Library росло, и вышла Pillow 2.0, в которую была добавлена поддержка Python 3. Это можно считать началом отдельной жизни проекта Pillow.

Pillow представляет из себя нативный модуль для Python, половина кода написана на С, половина — на Python. Версии Python поддерживаются самые разнообразные: 2.7, 3.3+, PуPу, PуPуЗ.

Pillow-SIMD


Это мой форк Pillow, который выходит с мая 2016 года. SIMD означает Single Instruction, Multiple Data — подход, при котором процессор может выполнять большее количество действий на такт, используя современные инструкции.

Pillow-SIMD — это не форк в классическом понимании, когда проект начинает жить собственной жизнью. Это замена Pillow, то есть вы устанавливаете одну библиотеку вместо другой, ни строчки не меняете в своем исходном коде, и получаете большую производительность.

Pillow-SIMD можно собирать с инструкциями SSE4 (по умолчанию). Это набор инструкций, который есть практически во всех современных x86 процессорах. Также Pillow-SIMD можно собирать с набором инструкций AVX2. Этот набор инструкций есть, начиная с архитектуры Haswell, то есть примерно с 2013 года.

OpenCV


Другая библиотека для работы с изображениями в Python, о которой вы наверняка слышали — это OpenCV (Open Computer Vision). Работает с 2000 года. Биндинг на Python входит в комплект. Это означает, что биндинг постоянно актуален, не бывает рассинхронности между самой библиотекой и биндингом.

К сожалению, эта библиотека пока не поддерживается в PyPy, потому что OpenCV базируется на numpy, а numpy только недавно стал работать под PyPy, и в OpenCV поддержки PyPy все еще нет.

VIPS


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

Это довольно старая библиотека — 1993 года, но она обогнала своё время. О ней долгое время было мало, что слышно, но в последнее время для VIPS стали появляться биндинги под разные языки, в том числе для Go, Node.js, Ruby.

Я долгое время хотел попробовать эту библиотеку, пощупать, но мне это не удавалось по очень глупой причине. Я не мог разобраться, как установить VIPS, потому что биндинг собирался очень сложно. Но теперь (в 2017 году) вышел биндинг pyvips от автора самого VIPS, с которым уже нет никаких проблем. Теперь установка и использование VIPS очень простая. Поддерживаются: Python 2.7, 3.3+, PуPу, PуPуЗ.

ImageMagick & GraphicsMagick


Если говорить о работе с графикой, то нельзя не упомянуть старичков — библиотеки ImageMagick и GraphicsMagick. Последняя изначально была форком ImageMagick с большей производительностью, но сейчас производительность у них, кажется, сравнялась. Других принципиальных отличий, насколько я знаю, между ними нет. Поэтому можно использовать любую, точнее, ту, которую вам удобнее использовать.

Это самые старые библиотеки из тех, о которых я сегодня упомянул (1990 год). За все это время было несколько биндингов для Python, и почти все из них благополучно умерли к настоящему моменту. Из тех, что можно использовать, остались:

  • Биндинг Wand, который построен на ctypes, но уже тоже не обновляется.
  • Биндинг pgmagick использует Boost.Python, поэтому компилируется очень долго и не работает в PyPy. Но, тем не менее, использовать его можно, я бы сказал, что он предпочтительнее, чем Wand.

Производительность


Когда мы говорим о работе с изображениями, первое, что нам интересно (по крайней мере мне) — это производительность, потому что иначе мы бы могли и на Python написать что-нибудь руками.

Производительность — это не такая простая штука. Нельзя просто сказать, что одна библиотека работает быстрее другой. В каждой библиотеке есть набор функций, и каждая функция работает с разной скоростью.

Соответственно, корректно говорить только о том, что производительность одной функции выше или ниже в конкретной библиотеке. Либо у вас есть приложение, которому нужен некий набор функциональности, и вы делаете бенчмарк именно под эту функциональность, и говорите, что для вашего приложения такая-то библиотека работает быстрее (медленнее).

Важно проверять результат


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

Недавно в статье, где сравнивалась производительность Pillow и OpenCV, мне попался такой код:

from PIL import Image, ImageFilter.BoxBlur
im.filter(ImageFilter.BoxBlur(3))
...

import cv2
cv2.blur(im, ksize=(3, 3))
...

Вроде бы и там, и там, BoxBlur, и там, и там аргумент 3, но на самом деле результат разный. Потому что в Pillow (3) — это радиус размытия, а в OpenCV ksize=(3, 3) — это размер ядра, то есть, грубо говоря, диаметр. В данном случае корректное значение для OpenCV было бы 3*2+1, то есть (7, 7).

В чем проблема?


Почему вообще производительность — это проблема при работе с графикой? Потому что сложность любой операций зависит от нескольких параметров, и чаще всего сложность растет линейно с каждым из них. А если этих факторов, например, три, и сложность линейно зависит от каждого, то получается сложность в кубе.

Пример: Гауссово размытие в OpenCV.

Слева — радиус 3, справа — 30. Как видно, разница в скорости более чем в 10 раз.

Когда передо мной встала задача добавить размытие по Гауссу в мое приложение, меня не устраивало, что гипотетически может тратиться 900 мс на выполнение одной операции. Таких операций в приложении тысячи в минуту, и тратить столько времени на одну — нецелесообразно. Поэтому я изучил вопрос и реализовал в Pillow размытие по Гауссу, которое работает за константное время относительно радиуса. То есть на производительность Гауссова размытия влияет только размер картинки.

Но здесь главное не то, что что-то работает быстрее или медленнее.

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

Наверное, самая частая операция, которую мы делаем с изображениями после их открытия, — это изменение размера (resize).

На графике представлена производительность (больше — лучше) разных библиотек для операции уменьшения изображения в 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.

  • Ресайз: от 4 до 7 раз.
  • Размытие: 2,8 раз.
  • Применение ядра 3×3 или 5×5: 11 раз.
  • Умножение и деление на альфа-канал: 4 и 10 раз.
  • Альфа-композиция: 5 раз.

Я уже сказал, что нельзя говорить, что какая-то библиотека работает быстрее, чем другая, но можно составить какой-то набор операций, который интересен именно вам. Я выбрал набор операций, которые интересны в моем приложении, сделал бенчмарк и получил такие результаты.

Оказалось, что 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, который уже есть сейчас.


Даже если вы нашли какой-то бенчмарк, еще не факт, что все будет работать именно с такой скоростью именно на вашей машине.

Набор бенчмарков


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

На GitHub есть проект с фреймворками для тестирования, где каждый может предложить свои бенчмарки или поправить существующие.

Параллельная работа


До сих пор я говорил о производительности в чистом виде, то есть на одно ядро процессора. Но нам всем давно доступны системы с бо́льшим количеством ядер, и хотелось бы их утилизировать. Здесь я должен сказать, что на самом деле Pillow — это единственная из всех рассматриваемых библиотек, которая не использует распараллеливание задач. Я сейчас постараюсь объяснить, почему так происходит. Все остальные библиотеки в том или ином виде его используют.

Метрики производительности


С точки зрения производительности нам интересны 2 параметра:
  1. Реальное время выполнения одной операции. Есть операция (либо последовательность операций), и вам интересно, за какое реальное время (wall clock) выполнится эта последовательность. Этот параметр важен на десктопе, где есть пользователь, который отдал команду и ждет результат.
  2. Пропускная способность всей системы (потока операций). Когда у вас есть набор операций, который идет постоянно, либо много независимых операций, и вам важна скорость обработки этих операций на вашем железе. Эта метрика более важна на сервере, где клиентов много, и нужно обслужить их всех. Время обслуживания одного клиента, конечно, важно, но чуть меньше, чем общая пропускная способность.

Исходя из этих двух метрик рассмотрим разные способы параллельной работы.

Способы параллельной работы


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

  2. На уровне графических операций — то, что как раз есть в большинстве графических библиотек. Когда графическая библиотека получает какую-то операцию, она внутри себя создает необходимое количество потоков, разбивает одну операцию на несколько более мелких, и выполняет их. При этом реальное время выполнения уменьшается — одна операция выполняется быстрее. Но пропускная способность растет далеко не линейно от количества ядер. Есть операции, которые не параллелятся, и яркий пример — это декодирование PNG-файлов — его никак нельзя распараллелить. Кроме того, есть накладные расходы на создание потоков, разбиение задач, которые тоже не дают пропускной способности расти линейно.

  3. На уровне команд процессора и данных. Мы специальным образом подготавливаем данные и используем специальные команды, для того чтобы процессор работал с ними быстрее. Это подход SIMD, который, собственно, и используется в Pillow-SIMD. Реальное время выполнения уменьшается, пропускная способность растет — это беспроигрышный вариант.

Как совместить параллельную работу


Если мы хотим совместить как-то параллельную работу, то SIMD хорошо совмещается с распараллеливанием внутри операции, и SIMD хорошо совмещается с распараллеливанием внутри приложения.

Но распараллеливание внутри приложения и внутри операции друг с другом не совмещаются. Если вы попробуете это сделать, то получите минусы от обоих подходов. Реальное время выполнения операции будет таким же, каким оно и было на одном ядре, а пропускная способность системы вырастет, но не линейно относительно количества ядер.

Многопоточность


Если уж мы заговорили про потоки — мы все пишем на Python и знаем, что в нем есть GIL, который не дает выполняться двум потокам одновременно. Python — это строго однопоточный язык.

Конечно, это не правда, потому что 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(...)
    ...

К счастью, эту проблему очень легко решить созданием ThreadPoolExecutor с одним тредом, на котором запускается обработка изображения. Этот вызов уже происходит асинхронно.
@run_on_executor(executor=ThreadPoolExecutor(1))
def process_image(self,
    ...
@gen.coroutine
def get(self, *args, **kwargs):
    im = yield process_image(...)
    ...

По сути здесь создается очередь с одним воркером, который выполняет именно графические операции, а Event Loop не блокируется и спокойно работает параллельно в другом потоке.

Ввод/Вывод


Еще одна тема, которую я бы хотел затронуть в рамках разговора о графических операциях — это ввод/вывод. Дело в том, что мы редко создаем какие-то изображения с помощью графической библиотеки. Чаще всего мы открываем изображения, которые пришли к нам от пользователей в виде закодированных файлов (JPEG, PNG, BMP, TIFF и пр.).

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

Ленивая загрузка


Первая такая плюшка — это ленивая загрузка. Если, например, в Pillow вы открываете изображение, то в этот момент не происходит декодирования картинки. Вам возвращается объект, который выглядит, как будто изображение уже загружено и работает. Вы можете посмотреть его свойства и решить на основании свойств этого изображения, готовы ли вы с ним работать дальше, не загрузил ли вам пользователь, например, гигапиксельную картинку для того, чтобы сломать ваш сервис.
>>> from PIL import Image
>>> %time im = Image.open()
Wall time: 1.2 ms
>>> im.mode, im.size
('RGB', (2152, 1345))

Если вы принимаете решение, что дальше работаете, то с помощью явного или неявного вызова load происходит декодирование этого изображения. Уже в этот момент выделяется нужное количество памяти.
>>> 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)

Но пользователь же не виноват в том, что у него картинка битая, он все равно хочет получить результат. К счастью, у Pillow есть режим битых картинок. Мы меняем одну настройку, и Pillow старается по максимуму игнорировать все ошибки декодирования, которые есть в изображении. Соответственно, пользователь видит хотя бы что-то.
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


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

Но это не все. На самом деле у 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)

Дальше, когда мы делаем магию с помощью OpenCV (обработку), мы вызываем еще один метод Pillow и обратно импортируем из OpenCV картинку в формат Pillow. Соответственно, можно снова пользоваться вводом/выводом.
import numpy
from PIL import Image
...
pillow_image = Image.fromarray(cv_image, "RGB")
pillow_image.save(filename)

Таким образом получается, что мы пользуемся вводом/выводом от Pillow, и процессингом от OpenCV, то есть берем лучшее из двух миров.

Надеюсь, это поможет вам построить нагруженное приложение для работы с графикой.

Узнать некоторые другие секреты разработки на Python, перенять бесценный и местами неожиданный опыт, а главное обсудить свои задачи можно будет уже совсем скоро на Moscow Python Conf++. Например, обратите внимание на такие имена и темы в расписании.
  • Donald Whyte с историей о том, как с помощью популярных библиотек, хитрости и коварства делать математику в 10 раз быстрее, а код — понятным и поддерживаемым.
  • Андрей Попов про сбор огромного количества данных и их анализ на наличие угроз.
  • Ефрем Матосян в своем докладе «Make Python fast again» расскажет, как увеличить производительность демона, обрабатывающего сообщения из шины.

Полной список того, что предстоит обсудить за 22 и 23 октября тут, успевайте присоединиться.

17 полезных библиотек и инструментов для фронтенда — Офтоп на vc.ru

Мы расскажем о 17 полезных библиотеках и инструментах, которые используют Frontend-разработчики Студии Т. Речь пойдет о технологиях, в ценности которых убедились на личном опыте. Каждая из них увеличит продуктивность и поможет в реализации конкретной задачи.

ИНСТРУМЕНТЫ

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

Fontsquirrel — генератор веб-шрифтов. Загружаешь файл шрифта — получаешь несколько форматов и уже готовый файл со стилями, который можно подключить.

Colorzilla — колорпикер. Аналог пипетки в Photoshop. Решает задачи с цветом. Позволяет получить образец цвета из любой точки браузера и скопировать в нужную программу. Анализирует страницу на палитру цветов и создает расширенные CSS градиенты.

Препроцессор Sass — простой язык стилей и мощный препроцессор. Легкая читабельность кода. Благодаря подключенной библиотеке Compass можно выйти за рамки CSS и работать со спрайтами в автоматическом режиме.

Sprite — простой способ сделать из множества картинок одну. Предположим, у вас на сайте четыре картинки. Когда пользователь заходит на страницу, он подгружает эти изображения. Sprite создает контейнер и помещает изображения в него. Количество обращений к серверу сокращается и подгружаются даже те картинки, которые понадобятся позже.

PhpStorm — среда разработки. Содержит отличное автодополнение кода. Поддерживает смешивание языков. В него встроен git, который позволяет работать с сервером, минуя лишнее открытие консоли. Удобная установка плагинов. Включает в себя опознаватель языка php для бэкенда. Включает гибкую систему настроек для разработчика.

git — система контроля версий. Обладает высокой скоростью работы, интеграцией с другими системами, удобным инт

Как работать с изображениями | Laboratory of Mathematical Methods of Image Processing

Не стоит работать на низком уровне с изображениями через системные функции

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

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

  • Написав свои классы для работы с изображениями. Особенно полезно это будет для тех, кто не имеет достаточного опыта программирования.
  • Через DIB (device independent bitmap). Данный способ рекомендуется в случае, когда помимо прямого доступа к пискелям изображения нужно рисовать на нём с помощью GDI-функций.

Работайте с пикселями в формате float, а не byte

Экономия памяти важна при написании коммерческого кода, но не при разработке математических методов обработки изображений. Использование float имеет следующие преимущества перед byte:
  • Отсутствие ошибок, связанных с переполнением при выходе за границы диапазона [0, 255]
  • Не накапливаются ошибки округления.
  • Многие алгоритмы значительно проще реализуются при использовании типа float, например, Canny edge detection. Некоторые алгоритмы вообще не могут быть реализованы при использовании типа byte для пикселя.
Более того, в современных процессорах работа с float будет производиться быстрее, чем с byte.

Делайте обход по изображениям в правильном порядке

Двумерные изображения хранятся в памяти в виде одномерных массивов. Обычно они записываются построчно: сначала идёт 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, в которых реализованы функции чтения и записи изображений:

30 чудных библиотек для PHP программистов / Хабр

Предлагаю читателям «Хабрахабра» перевод публикации «30 Amazing PHP Libraries for Programmers and Developers». Авторы собрали несколько удивительных PHP-библиотек, которые помогут реализовать некоторые классные вещи, не прилагая много усилий. Цель обзора состоит в том, чтобы преподнести что-то новое, поэтому список не включает популярные библиотеки.

30. Goutte

Goutte используется для скрапинга веб-сайтов и извлечения данных. Лицензия — MIT. Предоставляет обширный API для обхода сайтов/блогов и извлечения данных из HTML/XML.

29. GoogChart

GoogChart является классом PHP для создания динамичных диаграмм с помощью Google Charts. Не распространяется на весь API Google Charts, но делает их очень простыми в использовании.

28. GifCreator

Название говорит за себя. Это класс PHP, который генерирует анимированные GIF из нескольких изображений. Вам просто нужно указать изображения и продолжительность их отображения, вот и все. Размер и прозрачность определяются по первому кадру.

27. dBug

dBug является PHP-версией ColdFusion-ского sfdump. Он отображает цветную и хорошо структурированную информацию о переменной в табличном виде. Стили можно редактировать, таблицу можно сворачивать/разворачивать. dBug также можно заставить изменить вывод данных определенных типов. Например, вы можете настроить вывод объектной переменной в виде массива.

26. Alice

Alice позволяет мгновенно генерировать сотни фейковых данных (фикстуры) в целях тестирования. Вы можете генерировать сложные данные с ограничениями, которые легко читать и редактировать. Позволяет контролировать диапазоны фикстур, необязательные данные, значения объектов и уникальные ограничения.

25. PHPGeo

PHPGeo — простая библиотека для измерения расстояния между двумя координатами с высокой точностью. Она использует формулу Гаверсинуса и Винсента для вычисления расстояния. Вы можете интегрировать ее с любым приложением, связанным с картами или местоположениями.

24. Geocoder

Если вы планируете разработать geo aware приложение, взгляните на Geocoder. Это расширяемая PHP-библиотека делится на 2 части: Provider и HttpAdapter. Она также предлагает дополнительный уровень абстракции для геокодирования.

23. Purl

Purl — объектно-ориентированная библиотека для работы с URL. Вы можете легко создавать экземпляры URL и вызывать по цепочке методы после создания URL. Библиотека поддерживает манипуляции путем, фрагментом и запросом.

22. Snappy

Snappy позволяет создавать снимки, миниатюры и PDF по URL или HTML страницы. Эта библиотека использует WebKit на основе wkhtmltoimage и wkhtmltopdf, доступна для Windows, OSX и Linux.

21. ShellWrap

ShellWrap — библиотека, которая позволяет использовать мощные инструменты Unix/Linux в PHP. Вы можете легко вызывать команды, используя простой синтаксис и обработку ошибок исключениями PHP. Все аргументы должным образом экранируются, пути к исполняемым файлам будут разрешены автоматически.

20. Unirest

Unirest — это коллекция легких HTTP-библиотек, которые идеально подходят для многочисленных приложений. Выполняет PUT, DELETE, PATCH, GET и POST запросы. Поддерживается gzip, базовая аутентификация, загрузка файлов, формы, настраиваемые тайм-ауты и заголовки по умолчанию для каждого запроса.

19. IniScan

IniScan — это инструмент, предназначенный для сканирования php.ini файлов на предмет безопасности. Ищет распространенные ошибки безопасности и рапортует о результатах. Можно задавать порог для правил сканирования, чтобы найти ошибки выше указанного уровня.

18. PHP Captcha

PHP Captcha можно использовать для генерации аудио и видео капчи. Поддерживает вращение символов, выбор размера шрифта, выбор набора символов, случайный или указанный фон, дополнительный отображаемый текст и тень символов.

17. Ratchet

Ratchet — слабо связанная PHP библиотека, которая предлагает различные инструменты для разработки в режиме реального времени, двунаправленную связь приложения между сервером и клиентом через WebSockets. Есть много легкодоступных компонентов. Вы можете написать собственное приложение-чат за несколько минут.

16. TCPDF

TCPDF — PHP-класс (открытый) для создания PDF-документов. Он поддерживает все стандартные форматы страницы, пользовательский формат страниц, UTF-8, PDF аннотации, в том числе ссылки, режим рендеринга текста, набор шрифтов, растягивание текста и интервал, сжатие страниц, TrueTypeUnicode и OpenTypeUnicode.

15. Munee

Библиотека Munee может использоваться для компиляции на лету CoffieScript, Less, SCSS, изменения размера изображения, сжатия JS & CSS, и кэширования результата на стороне сервера и клиента, без изменения assets в шаблоне. В целом, это хороший вариант для достижения молниеносных запросов и сохранения пропускной способности.

14. HTML Purifier

HTML Purifier — библиотека для фильтрации HTML, разработанная для удаления всего вредоносного кода. Может быть использована для защиты кода от XSS атак. Эта библиотека использует надежные белые списки, агрессивный разбор, и убеждается, что в результате разметка соответствует стандартам.

13. Detector

Detector — открытая библиотека для определения многочисленных сведений о пользователях/посетителях. Это может помочь вам построить точные веб-аналитики. Она отображает пользовательский агент, тип устройства, используемый браузер вместе с его HTML и CSS возможностями. Также сообщает, кто запросил данные — человек или бот.

12. Whoops

Whoops поможет вам работать с ошибками и исключениями в менее болезненной форме. Предоставляет отличный интерфейс, сообщающий вам подробную информацию об ошибках и исключениях, присутствующих в коде (с подсветкой). Кроме того, поддерживает JSON, XML, SOAP и AJAX.

11. Gaufrette

Gaufrette обеспечивает уровень абстракции для файловой системы, что позволяет вам разрабатывать приложения без необходимости знать, где и как будут сохранены медиа-файлы. Также позволяет менять расположение файлов без изменения исходного кода, кроме определения файловой системы.

10. Imagine

Imagine, это богатая объектно-ориентированная библиотека для работы с изображениями. Она может обрабатывать различные операции, такие как открытие, сохранение, создание, изменение размеров, водяные знаки, создать коллаж, делать отражение изображения и т.д. Система координат Imagine позволяет рисовать различные фигуры на изображениях. Класс для работы с цветом помогает создавать значения RGB для применения цветов к изображениям. Он также поддерживает слои и манипуляции для анимированных GIF.

9. Idiorm

Idiorm — легковесный ORM и гибкий конструктор запросов для PHP5, представляющий собой надстройку над PDO. С ним не надо будет писать длинные и рутинные SQL запросы. Кроме того, он не требует ни XML настроек, ни классов моделей, ни генераторов кода.

8. phpFastCache

Как следует из названия, это высоко производительная система кэширования. Она предназначена для ускорения динамических веб-приложений за счет снижения нагрузки на базы данных. Она поддерживает несколько методов кэширования (период может быть явно определен), включая MemCache, Memcached, файлы, wincache, mpdo, pdo и apc. Вы не должны переписывать свой PHP класс для кэширования снова, при изменениях на серверах.

7. JpGraph

JpGraph — PHP библиотека для создания объектно-ориентированных графиков. Имеет более 200 встроенных флагов стран, 400 именованных цветов и поддерживает дополнительно диаграммы Ганта, несколько Y-осей, альфа-смешивание и внутреннее кэширование (с таймаутом). Эта библиотека позволяет строить линейные диаграммы, гистограммы, пироги, карты, свечи, полярные, радар, круговые и контурные диаграммы любого размера.

Читайте: 20+ Полезных онлайн инструментов для создания графиков и диаграмм.

6. SEOstats

SEOstats — мощная библиотека с открытым исходным кодом, которая предоставляет различные относящиеся к SEO показатели, такие как детальный анализ обратных ссылок, рейтинг страницы, тренды сайта, ключевые слова, статистика трафика, Alexa rank и многое другое. Она собирает данные от Alexa, Google, Moz, open site explorer, SEMRush, Facebook и Twitter.

5. PHP Parser

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

4. PHP Error

PHP Error — библиотека, которая используется для преобразования обычных сообщений об ошибках в более наглядные с полной подсветкой синтаксиса и с фрагментами кода. Она исправляет некоторые сообщения об ошибках, которые просто неверны и применима для AJAX. Кроме того, вы можете вручную выключать или включать ее, запускать отдельные разделы без сообщений об ошибках и игнорировать выбранные файлы.

3. PHP-CPP

PHP-CPP — библиотека C++, которая может быть использована для разработки расширений PHP. Она построена с помощью простых в использовании и хорошо документированных классов для создания собственных расширений для PHP. Это может ускорить вашу программу, потому что код, написанный на C++ выполняется быстрее, чем на PHP.

2. Eden

Eden — набор повторно используемых компонентов, который работает практически со всеми PHP-фреймворками и CMS. Охватывает компоненты для автозагрузки, кэша, файловых систем, веб сервисов, шаблонов, интернационализации, платежных систем и облачных технологий. Работает с основными веб-сервисами, включая Google, Facebook, Yahoo, PayPal, Tumblr, Foursquare и Amazon Web Services.

1. Locust

Locust — простой в использовании инструмент тестирования пользовательской нагрузки. Он может быть использован для выяснения, сколько одновременных пользователей выдержит система. Позволяет писать сценарии на Python. У Locust отличный интерфейс (HTML + JS), который отображает важные данные в режиме реального времени.

Работа с изображениями на C ++ или C

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

Список библиотек C ++ с открытым исходным кодом

Цель этой страницы - создать исчерпывающий список библиотек C ++ с открытым исходным кодом, чтобы при необходимости реализации определенной функциональности не тратить время на поиск в сети (DuckDuckGo, Google, Bing и т. Д.).

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

Страница предоставляется «как есть» с надеждой на то, что она будет полезной, но без каких-либо гарантий. Здесь могут появляться устаревшие, вводящие в заблуждение или неправильные ссылки. Если вы заметили один из них, было бы здорово, если бы вы исправили ошибку.

Кросс-платформенная библиотека DSP Библиотека Микро-фреймворк Лицензия на программное обеспечение Библиотека ftp Набор инструментов разработки Фреймворк Реализация Реализация CORBA на основе Библиотека шаблонов выражений C ++ Библиотека парсинга Реализация Библиотека драйверов Ядро Лицензия Лицензия Кросс-платформенный механизм 2D-растеризации и рендеринга Графический процессор
Библиотека Описание Лицензия Конфигурация
Aquila
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
штраффтп-сервер для 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 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 для 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
Графика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 Современная кроссплатформенная библиотека низкоуровневой трехмерной графики.
.Обработка изображений

.NET Core | .NET Blog

Bertrand

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

CoreCompat.System.Drawing

Если у вас есть существующий код, основанный на 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

ImageSharp - это совершенно новая библиотека с полностью управляемым кодом и кроссплатформенной обработкой изображений. Его производительность не так хороша, как у библиотек, зависящих от собственных зависимостей ОС, но она остается очень разумной. Его единственная зависимость - это сам .NET, что делает его чрезвычайно портативным: нет дополнительных пакетов для установки, просто обратитесь к самому ImageSharp, и все готово.

Если вы решите использовать ImageSharp, не включайте пакет, который отображается в NuGet: он будет пустым заполнителем до выхода первого официального выпуска ImageSharp. На данный момент вам нужно получать еженощную сборку из ленты MyGet. Это можно сделать, добавив следующий NuGet.config в корневой каталог проекта:

Изменить размер изображения с помощью ImageSharp очень просто.

Для новой кодовой базы библиотека на удивление завершена. Он включает в себя все фильтры, которые вы ожидаете от обработки изображений, и даже включает в себя всестороннюю поддержку чтения и записи тегов EXIF ​​(этот код используется совместно с Magick.NET):

Обратите внимание, что последние сборки ImageSharp более модульны, чем раньше, и если вы собираетесь использовать форматы изображений, такие как Jpeg, или возможности обработки изображений, такие как Resize , вам необходимо импортировать дополнительные пакеты. в дополнение к основному пакету ImageSharp (соответственно ImageSharp.Processing и ImageSharp.Formats.Jpeg ).

Magick.NET

Magick.NET - это .NET-оболочка для популярной библиотеки ImageMagick. ImageMagick - это кроссплатформенная библиотека с открытым исходным кодом, которая фокусируется на качестве изображения и предлагает очень широкий выбор поддерживаемых форматов изображений.Он также поддерживает EXIF ​​так же, как ImageSharp.

Сборка Magick.NET .NET Core в настоящее время поддерживает только Windows. Автору библиотеки Дирку Лемстре нужна помощь в преобразовании сценариев сборки для собственной зависимости ImageMagick, поэтому, если у вас есть опыт создания собственных библиотек на Mac или Linux, это отличная возможность помочь в отличном проекте.

Magick.NET имеет лучшее качество изображения из всех библиотек, обсуждаемых в этом посте, как вы можете видеть в примерах ниже, и работает относительно хорошо.Он также имеет очень полный API и лучшую поддержку экзотических форматов файлов.

SkiaSharp

SkiaSharp - это .NET-оболочка для кроссплатформенной библиотеки 2D-графики Google Skia, которая поддерживается командой Xamarin. SkiaSharp теперь совместим с .NET Core и работает очень быстро. Поскольку он полагается на собственные библиотеки, его установка может быть сложной, но я смог легко заставить его работать в Windows и macOS. В настоящее время Linux представляет собой более сложную задачу, поскольку необходимо создавать некоторые собственные библиотеки из кода, но команда работает над устранением этих препятствий, поэтому SkiaSharp скоро станет очень интересным вариантом.

FreeImage-dotnet-core

Эта библиотека для собственной библиотеки FreeImage является тем же, чем Magick.NET для ImageMagick: оболочкой .NET Core. Он предлагает хороший выбор форматов изображений, хорошую производительность и хорошее визуальное качество. Однако кроссплатформенная поддержка на данный момент не идеальна, поскольку мне не удалось сохранить изображения на диск в Linux и macOS. Надеюсь, это скоро будет исправлено.

MagicScaler

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; ), так как на этой рабочей станции у меня была значительно худшая производительность, чем на моем ноутбуке.

Image Resizing Performance (Windows)

Библиотека Загрузка, изменение размера, сохранение (мс на изображение) Изменение размера (мс на изображение)
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 н / д

Для обоих показателей чем ниже, тем лучше.

Image Resizing Performance (macOS)

Библиотека Загрузка, изменение размера, сохранение (мс на изображение) Изменение размера (мс на изображение)
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

Для обоих показателей чем ниже, тем лучше.

Image Resizing Performance (Linux)

Библиотека Загрузка, изменение размера, сохранение (мс на изображение) Изменение размера (мс на изображение)
CoreCompat.System.Drawing 114 ± 5 ​​ 92 ± 1
ImageSharp 384 ± 5 ​​ 128 ± 1
FreeImage нет данных 29,7 ± 2

Для обоих метрики, чем ниже, тем лучше.

File Size

Библиотека Размер файла (в среднем, кБ на изображение)
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.

.

nothings / stb: однофайловые библиотеки публичного домена stb для C / C ++

перейти к содержанию Зарегистрироваться
  • Почему именно GitHub? Особенности →
    • Обзор кода
    • Управление проектами
    • Интеграции
    • Действия
    • Пакеты
    • Безопасность
    • Управление командой
    • Хостинг
    • мобильный
    • Истории клиентов →
    • Безопасность →
  • Команда
  • Предприятие
  • Проводить исследования
    • Изучите GitHub →
    Учитесь и вносите свой вклад
    • Темы
    • Коллекции
    • В тренде
    • Учебная лаборатория
    • Руководства с открытым исходным кодом
    Общайтесь с другими
    • События
    • Форум сообщества
.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *