Объедините два изображения с одним прозрачным - PullRequest
1 голос
/ 22 мая 2009

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

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

Я хочу показать свою форму на картинке с USB-камеры. Белая часть будет считаться прозрачной для комбинации. Сейчас я думаю о редактировании пикселей изображения за пикселями, но я ищу API, который сделает это за меня.

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

Я использую .NET, если это может помочь. Я также мог бы использовать Win32 API, если он содержит некоторые полезные функции.

Редактировать: Я принял ответ, потому что он поставил меня на правильный путь. Это на самом деле очень легко сделать.

Bitmap^ overlay_image = gcnew Bitmap("overlay.bmp");
Bitmap^ original_image = gcnew Bitmap("original.bmp");
overlay_image->MakeTransparent(Color::White);
Graphics^ g_original = Graphics::FromImage(original_image);
g_original->DrawImage(overlay_image, 0, 0);

Вуаля, original_image теперь имеет красный прямоугольник над ним. Это на самом деле достаточно быстро для моей USB-камеры со скоростью 30 кадров в секунду, поэтому я могу получить ее в режиме реального времени.

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

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Одна очень надежная библиотека, на которую стоит обратить внимание: ImageMagick . У них даже есть .NET порт библиотеки. Он может делать вещи, связанные с прозрачностью, формами и наложением.

Я мог бы попытаться сначала использовать версии командной строки (например, команду convert или composite), чтобы проверить, можете ли вы заставить их делать то, что вы хотите. Если это работает, вы должны иметь возможность реализовать те же функции, используя их библиотеки.

1 голос
/ 22 мая 2009

Если вы используете полную платформу .NET, System.Drawing.Imaging имеет функции для альфа-каналов и маскирования:

http://www.codeproject.com/KB/GDI-plus/alphafx.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...