Изначально задача была: извлечь из изображения область ограниченную полигоном, при этом оставшаяся часть изображения должна залиться “прозрачным” цветом (сиречь размер в пикселях не поменяется). Но как оказалось, можно ещё более обобщить эту задачу - вытаскивать произвольные области изображения.
Рассматриваемый инструмент - ImageMagick или GraphicsMagick.
Решение нашлось тут:
http://studio.imagemagick.org/pipermail/magick-users/2006-March/017281.html
Коротко суть: на основе исходного изображения (по сути используется только, что бы задать размеры) создаётся временное изображение-маска и нарисованной фигурой/фигурами которые образуются, если их обрисовать полигоном. Остальные пиксели на маске - прозрачные. Далее маска накладывается на исходное изображение и извлекается только нужная его часть…
Теперь на примере.
Есть изображение:

Нужно вырезать область, заданную полигоном (для простоты - треугольник) с координатами: (10,10)-(400,200)-(100,200)
Шаг 1. Делаем маску:
convert screenshot.png -matte -fill none -draw 'color 0,0 reset' -fill white -draw 'polygon 10,10,400,200,100,200' polygon.png
Получаем следующее (картинка белая :simple_smile: ):

Шаг 2. Вырезаем область:
convert screenshot.png -matte polygon.png -compose DstIn -composite out.png
Получаем чего желаем:

Команды рисования можно посмотреть тут:
http://www.imagemagick.org/Usage/draw/
Библиотеки/рекомендации для работы с JSON.
C
C++
BOOST
Qt4
Просто прекрасно:
Почему сейчас таких фильмов нет?
Накатило, решил найти исходники этой программки. Что делает? Да просто берёт и играет mp3 файл. Чем знаменита? :) А тем, что это мой первый проигрыватель mp3 на Linux, который попался мне случайно на купленном диске во Владивостоке, во времена, когда у меня не было интернета и в своём городе-посёлке я был единственным пингвиноводом.
Source1 (на этом сайте) |
Source2 |
Где найдено
Никаких внешних зависимостей, исходники на чистом Си, в распакованном виде - 290Кб.
PS при сборке на современных системах нужно будет применить такой патч:
--- /home/hatred/download/tmp/mp3/amp-0.7.6/guicontrol.c 1997-08-23 22:30:51.000000000 +1100
@@ -375,7 +375,8 @@
break;
case GETHDR_SYN: warn("oops, we're out of sync.<br/>n");
break;
1. default:
+ default:
+ ;
}
break;
}
по сути, после default:, поставить точку с запятой :simple_smile:
Что бы при использовании плагина googleplusone совместно с BlogTNG при попытке “поделиться” постом в
Google+ вставлялся не абы какой текст, а то, что вам нужно, следует внести некоторые модификации в используемый вами шаблон.
Читаем:
http://newsru.com/russia/10jan2012/games.html
Пацреоты - фперёт!
http://kapano.ucoz.ru/
Просто слов нет. Круто. Красиво. В основном - Владивосток и его окрестности.
http://softwaremaniacs.org/Images/alenacpp/cppmap-2012.png
hypot(x, y) создан, что бы не звать sqrt(x*x + y*y)
Подробности:
http://freetype.sourceforge.net/david/reliable-c.html
UPD 2014-06-09: сменил ссылку, прошлая убилась
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahg%2Frzahgicprog2.htm - iSeries Information Center, версия 5, выпуск 3
В разделе есть примеры кода, достаточно много про сокеты
написано (в том числе и
мультикаст и
SSL).
- Q: Boost.Asio - что нужно указать в cmake среди компонентов при поиске библиотеки boost?
A: только библиотеку system:
find_package(Boost REQUIRED COMPONENTS system)
- Q: Boost.Thread и кроскомпиляция - что делать, если получаем ошибку вида:
undefined reference to 'boost::tss_cleanup_implemented()'?
A: для начала чуток обратно: в случае Linux, в качестве компонента при поиске библиотеки нужно указывать thread, а в случае windows (и кроскомпиляции): thread_win32, т.е. необходимо писать что-то вроде такого кода:
set(BOOST_COMPONENTS
program_options
system)
# Boost thread library is different on Win/Linux
if(WIN32)
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread_win32)
else()
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} thread)
endif()
...
find_package(Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED)
Подсказку увидел тут:
https://lists.gnu.org/archive/html/mingw-cross-env-list/2010-11/msg00063.html. Так же следует добавить следующее (при статической линковке):
add_definitions(-DBOOST_THREAD_USE_LIB=1)
Далее, собственно, относительно самого вопроса, предлагают в случае появления такой ошибки при компиляции, поместить в любой свой исходник следующее:
namespace boost {
void tss_cleanup_implemented() { }
}
чистой воды хак :) Дополнительно написано тут:
https://solarcore.blogspot.com/2010/10/boost-c-threads-mingw-mac-os-x.html
Если коротко: функиця заполняет структуру типа in_addr, преобразуя сведения о хосте из строкового представления.
У winsock2 нет такой функции. Есть более продвинутый аналог inet_pton, в POSIX он тоже есть, да вот только mingw про неё в windows не знает. Пичалька.
Поэтому делаем примерно следующее:
#ifdef WIN32
static int inet_aton(const char *cp, struct in_addr *inp)
{
if (cp == 0 || inp == 0)
{
return -1;
}
unsigned long addr = inet_addr(cp);
if (addr == INADDR_NONE || addr == INADDR_ANY)
{
return -1;
}
inp->s_addr = addr;
}
#endif
не верх совершенства и корректности, но для моих целей работало.
По сути парочка дополнений для этой статьи:
http://mingw-cross.sourceforge.net/cross_debug.html
Задача: есть win32 приложение, собранное путём кросс-компиляции при помощи cmake и mingw32, нужно запустить его в отладчике и поймать на чём оно падает.
Необходимый инстументарий:
- установленный mingw32
- wine (winconsole)
- бинарная версия gdb для windows, брать тут:
http://sourceforge.net/projects/mingw/files/MinGW/Extension/gdb/
- версия gdb, собранная для Linux, знающая как подгружать win32 приложения, собранные mingw. Тут нужно искать сборку для вашего дистрибутива, для пользователей ArchLinux я сделал PKGBUILD и поместил его в AUR:
https://aur.archlinux.org/packages.php?ID=54802
продвинутые пользователи могут подглядывать в мои правила сборки и собирать самостоятельно :)
Бинарную версию нужно будет распаковать, например в ~/bin/mingw32-gdb-win32/. В директорию ~/bin/mingw32-gdb-win32/bin/ при этом следует сделать следующие симлинки:
cd ~/bin/mingw32-gdb-win32/bin/
ln -s /usr/i486-mingw32/bin/libexpat-1.dll .
ln -s /usr/i486-mingw32/bin/libiconv-2.dll .
ln -s /usr/i486-mingw32/bin/libintl-8.dll .
Всё. Впринципе всё готово для отладки.
- Запускаем сервер:```bash
wineconsole cmd /K ~/bin/mingw32-gdb-win32/bin/gdbserver.exe localhost:6000 test-app.exe [аргументы для программы с которыми она должна запускаться]
1. Запускаем клиент gdb:```bash
i486-mingw32-gdb test-app.exe
- В запущенной версии gdb выполняем следующую команду:```gdb
(gdb) target remote localhost:6000
Ну и по сути всё, дальше делаем всё как при обычной отладке при помощи gdb, устанавливаем точки останова, смотрим данные, делаем бектрейсы и т.д. Единственная разница, что для запуска приложения нужно использовать не команду `run`, а команду `continue`, но собственно если забудете или перепутаете - отладчик вам подскажет.
Если программа что-то выбрасывает на консоль, вы увидете это в окне wineconsole.
Если захочется графической отладки, смотреть в сторону ddd и ссылку, что я давал в начале поста.
unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
в Linux:
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
или универсальная функция:
void setSockNonblock(int sockfd)
{
#ifdef WIN32
unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
#else
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
#endif
}