Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164

Альфаканал в изображении

04.03.2014, 13:36. Показов 3018. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу хромакеинг, использую OpenCV для того, чтобы получать картинку с камеры.

1. Получаю IplImage (изображение opencv).
2. Преобразовываю его в HBITMAP и помечаю ненужные мне пиксели для отсеивания белым цветом.
3. Преобразовываю в Gdiplus::Bitmap, и теперь, мне нужно белые пиксели сменить прозрачными.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void addAlpha(Gdiplus::Bitmap *input) {
    int w = input->GetWidth();
    int h = input->GetHeight();
 
    Gdiplus::Color color;
    color.MakeARGB(0, 0, 0, 0);
 
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            input->SetPixel(j, i, color);
        }
    }
}
Но вместо прозрачного там черный цвет, помогите разобраться! Как добавить альфа канал в картинку?
Есть идеи по сменить формат пикселей, но я новичок, не знаю как.
Пожалуйста!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.03.2014, 13:36
Ответы с готовыми решениями:

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

Отметки на изображении
Такой вопрос, необходимо ставить n'ое(много) колличество отметок по определенным координатам на изображении. Отметки могут быть любого...

Артефакты на изображении
В один прекрасный день в играх начала происходить это, помогите пожайлуста решить эту проблему! Видеокарта Sapphire ATI Radeon HD5550

14
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
04.03.2014, 14:38
Да вроде все правильно. М. б. фон черный? И GdiplusStartup, GdiplushShutdown вызваны? Давайте весь код.
0
Заблокирован
04.03.2014, 14:49
Цитата Сообщение от igor_petrov Посмотреть сообщение
for (int i = 0; i < h; i++) {
* * * * for (int j = 0; j < w; j++) {
* * * * * * input->SetPixel(j, i, color);
* * * * }
* * }
ну ты же в цикле всем пикселям один и тот же цвет чёрный задаёшь, а чтоб он был прозрачный - тебе альфа блендинг нужен.... В общем по конкретней задачу описывай
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
04.03.2014, 14:54  [ТС]
Это функция перерисовки окна:
получаем кадр с камеры в m_hBitmapFrame уже отхромакеинное (белым цветом)
потом конвертируем в Bitmap в переменную pBitmap, уменьшаем в pBitmapResized и потом выводим между слоев
но последний слой(самый нижний перекрывается кадром без альфа канала), а нужно чтоб кадр был с альфой, чтоб был виден задник

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
void Program::Draw() {
    m_hBitmapFrame = ConvertIplImage2HBITMAP(BadKeyer(copy));
 
    if (m_hBitmapFrame) {
        Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromHBITMAP(m_hBitmapFrame, NULL);
        Gdiplus::Bitmap* pBitmapResized = ResizeClone(pBitmap, IMG_WIDTH, IMG_HEIGHT);
 
        // здесь нужно сменить белые пикселы альфой в pBitmapResized
 
        HDC mem = CreateCompatibleDC(m_hdc);
        HBITMAP map = CreateCompatibleBitmap(m_hdc, 1920, 1080);
        SelectObject(mem, map);
 
        Gdiplus::Graphics g(mem);
        g.Clear(m_bgColor); // для дебага поставил ядовито-розовый цвет как фон
 
        //layers
        for (int i = 0; i < m_theme[m_nTheme].picture[m_nPic].resized.size(); i++) {
            g.DrawImage(m_theme[m_nTheme].picture[m_nPic].resized[i], IMG_OFFSET_BORDER_X, IMG_OFFSET_BORDER_Y);
            if (i == m_nPos) {
                g.DrawImage(pBitmapResized, IMG_OFFSET_BORDER_X, IMG_OFFSET_BORDER_Y);
            }
        }
 
        Gdiplus::Pen *pen = new Gdiplus::Pen(Gdiplus::Color::Snow);
        int offset = 10;
        g.DrawLine(pen, offset, 1080 / 2, 1920/2, 1080 / 2);
        g.DrawLine(pen, 1920/2, offset, 1920/2, 1080-offset );
        delete pen;
 
        BitBlt(m_hdc, 0, 0, 1920, 1080, mem, 0, 0, SRCCOPY);
 
        DeleteDC(mem);
        DeleteObject(map);
        delete pBitmap;
        delete pBitmapResized;
        DeleteObject(m_hBitmapFrame);
    }
}
 
//функция берет IplImage* и меняет цвет отсеивающихся пикселей на белый
IplImage* Program::BadKeyer(IplImage *input) {
    int w = input->width;
    int h = input->height;
 
    int r, g, b;
 
    for (int y = 0; y<h; y++) {
        uchar* ptr = (uchar*)(input->imageData + y * input->widthStep);
        for (int x = 0; x < w; x++) {
            r = ptr[3 * x + 2];
            g = ptr[3 * x + 1];
            b = ptr[3 * x];
 
            if (r<m_rColor + m_rRange && r>m_rColor - m_rRange &&
                g<m_gColor + m_gRange && g>m_gColor - m_gRange &&
                b<m_bColor + m_bRange && b>m_bColor - m_bRange) {
 
                ptr[3 * x + 2] = 255;
                ptr[3 * x + 1] = 255;
                ptr[3 * x] = 255;
            }
        }
    }
 
    return input;
}
0
Заблокирован
04.03.2014, 15:03
Твоя ошибка в том, что ты используешь BitBlt, используя при этом GDI+.
Раз используешь GDI+ - то и делай всё на нём, лень разбираться в твоём коде, но тебе в картинке твоей не надо подменять цвета, надо просто рендерить её куда надо с COLOR_KEY В твоём случае (альфа тебе не нужна), просто отрывок из какой - то старой своей программки:
C++
1
2
3
4
5
6
7
ImageAttributes imAtt;          
imAtt.SetColorKey( Color(0, GetRValue(keyboard->colorKey), GetGValue(keyboard->colorKey), GetBValue(keyboard->colorKey)), Color(0, GetRValue(keyboard->colorKey), GetGValue(keyboard->colorKey), GetBValue(keyboard->colorKey)), ColorAdjustTypeDefault);
 
if((*it)->type ==  STATIC)
{
    CStatic * item = (CStatic*)(*it);
    graphics.DrawImage(item->imgNormal, Gdiplus::Rect(item->x + keyboard->startX, item->y + keyboard->startY, item->width,item->height), 0, 0, item->width, item->height, UnitPixel, &imAtt, 0);
1
 Аватар для FreeMan108
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
04.03.2014, 15:06
Цитата Сообщение от THE--MASTER Посмотреть сообщение
ну ты же в цикле всем пикселям один и тот же цвет чёрный задаёшь, а чтоб он был прозрачный - тебе альфа блендинг нужен.... В общем по конкретней задачу описывай
Не ну вообще прозрачность была поставлена правильно. alpha = 0 - полностью прозрачный.

Цитата Сообщение от igor_petrov Посмотреть сообщение
Но вместо прозрачного там черный цвет, помогите разобраться! Как добавить альфа канал в картинку?
Ты переносишь прозрачный объект gdiplus на hBitmap, который не поддерживает прозрачность. Естественно они будут черные.
1
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
04.03.2014, 15:19  [ТС]
у меня BitBlt() используется для двойной буфферизации же, я новичок в Gdi+, поэтому нашел пример и использую его теперь. Раньше я использовал родной windows GDI
проблема не в этом BitBlt совсем

сейчас попробую ImageAttributes

Добавлено через 1 минуту
FreeMan108, нене, я переношу на Gdiplus::Bitmap картинку HBITMAP
нужно добавить Gdiplus::Bitmap'у альфу.

Добавлено через 9 минут
Получилось, парни! От души всем)
Решил с помощью ImageAttributes

C++
1
2
3
4
5
6
7
8
9
10
11
12
        //layers
        for (int i = 0; i < m_theme[m_nTheme].picture[m_nPic].resized.size(); i++) {
            g.DrawImage(m_theme[m_nTheme].picture[m_nPic].resized[i], IMG_OFFSET_BORDER_X, IMG_OFFSET_BORDER_Y);
            if (i == m_nPos) {
 
                ImageAttributes imAtt;
                imAtt.SetColorKey(Color(0, 255, 255, 255), Color(0, 255, 255, 255), ColorAdjustTypeDefault);
                g.DrawImage(pBitmapResized, Gdiplus::Rect(IMG_OFFSET_BORDER_X, IMG_OFFSET_BORDER_Y, IMG_WIDTH, IMG_HEIGHT), 0, 0, IMG_WIDTH, IMG_HEIGHT, UnitPixel, &imAtt, 0);
 
                //g.DrawImage(pBitmapResized, IMG_OFFSET_BORDER_X, IMG_OFFSET_BORDER_Y);
            }
        }
0
Заблокирован
04.03.2014, 15:31
Цитата Сообщение от igor_petrov Посмотреть сообщение
Получилось, парни! От души всем)
Решил с помощью ImageAttributes
Ну я же об этом сразу и сказал.
Кстате, как я и говорил выше - это использование ColorKey, в GDI+ можно использовать полноценно Alpha канал вместо прозрачного ключа - но это уже немного другая история
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
09.03.2014, 11:21  [ТС]
Всем привет еще раз, появилась такая проблема, что при кеенге, появляется определенного цвета окантовка вокруг объекта. Привожу скриншот кеера, на данный момент на котором кеется цвет стен)
Чтоб было видно какие края (черные линии, полоски итп).

THE--MASTER, если не трудно, пожалуйста, расскажи как отсеивать используя не ColorKey, а именно альфу

Сроки горят, так что прошу помощи!
Миниатюры
Альфаканал в изображении  
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
09.03.2014, 21:17  [ТС]
Показываю еще один скриншот, тестовый кеинг (сейчас не важно что именно кеить) - я решил навести камеру на люстру c:
Главное подскажите мне пожалуйста, как решить вопрос с белой окантовкой по краям.
Миниатюры
Альфаканал в изображении  
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
11.03.2014, 00:08  [ТС]
Нужна помощь, помогите пожалуйста.
0
Заблокирован
11.03.2014, 09:32
Цитата Сообщение от igor_petrov Посмотреть сообщение
Нужна помощь, помогите пожалуйста.
давай весь свой проект сюда - сделаю тебе альфу
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
11.03.2014, 12:30  [ТС]
Собрал тестовый проект с сабжом внутри, отсеял ненужный хлам, скидываю в рарке, только нужно для запуска OpenCV 2.4.8
Вложения
Тип файла: rar cyber.rar (9.43 Мб, 4 просмотров)
0
Заблокирован
11.03.2014, 14:09
Лучший ответ Сообщение было отмечено igor_petrov как решение

Решение

Слушай, пока времени нет смотреть твой проект.
Вот тут можешь глянуть пример и заодно весь этот урок скачать - там как раз то, что тебе нужно:
http://www.codeproject.com/Art... -using-GDI
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
11.03.2014, 14:31  [ТС]
THE--MASTER, благодарю за ответ, посмотрю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.03.2014, 14:31
Помогаю со студенческими работами здесь

Пиксели в изображении
Есть некий bitmap,в нём изображение,мне нужно взять n количество пикселий и переместить в рядом стоящий bitmap(не всё изображение,а часть...

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

Сетка на изображении
Здравствуйте! на днях написал программу на паскале, которая через заданное количество пикселей ведет линию от начала изображения до конца...

Проверка в изображении
if image1.Picture='sprite\gun1.jpg' then В чём ошибка проверки?

Сетка на изображении
Господа,не могли бы помочь с выводом сетки на изображении? нужно написать программу :) Дано изображение,его загружаем,и необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru