|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.07.2013, 07:34 | #1 |
Регистрация: 01.07.2013
Сообщений: 8
|
CBitmap - копирование части, рисование наложением
1. Есть CBitmap A,B. Я хочу передать из A в B только часть его содержимого, определив эту часть например через регион. Предполагаю, что надо использовать CDC с функцией SelectClipRgn, чтобы определить этот регион, и затем записать это изображение в B. Но как это сделать?
2. Есть CBitmap A,B. Я хочу нарисовать сначала изображение A, затем B так, чтобы нарисовать только суть изображения B, без фона. Рисую через CDC и BitBlt. Например, A - большой синий круг, B - маленький желтый круг. Если B рисовать в центре A, то в центре A будет: с SRCCOPY будет белый прямоугольник со вписанным желтым кругом, с SRCAND зеленый круг в центре синего. Как это решить? |
01.07.2013, 08:34 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
По пункту 2 читайте про TransparentBlt() и AlphaBlend(). Возмножно, что в MFC их нет и придется вызывать напрямую.
|
01.07.2013, 11:53 | #3 |
Регистрация: 01.07.2013
Сообщений: 8
|
Спасибо, TransparentBlt хорошее решение. К тому же можно использовать FillRgn для определения маски для этой функции.
Вопрос по первой задаче остался. |
02.07.2013, 08:34 | #4 |
Регистрация: 01.07.2013
Сообщений: 8
|
Кто-нибудь может сказать как сохранить изображение из CDC в CBitmap?
|
02.07.2013, 08:45 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
CBitmap bitmap.
CDC dc; dc.SelectObject(bitmap); dc.RisuemZdes(); // Zdes uje bitmap narisovan |
02.07.2013, 09:21 | #6 |
Регистрация: 01.07.2013
Сообщений: 8
|
|
02.07.2013, 10:27 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
dc всегда рисует в битмап.
Надо создать свой dc, напоример через dc.CreateCompatibleDC() и "прочитать" изначальный dc через BitBlt |
02.07.2013, 16:33 | #8 |
Регистрация: 01.07.2013
Сообщений: 8
|
Тогда посмотрите пожалуйста этот код:
m_bitmaps - это вектор для хранения полученных CBitmap-ов из большого CBitmap m_bitmaps.clear(); m_bitmaps.reserve(4); // DС с картинкой-источником CDC SourceDC, destDC; SourceDC.CreateCompatibleDC(pMainDC ); destDC.CreateCompatibleDC(pMainDC); CBitmap bmpWhole; bmpWhole.LoadBitmap(IDB_TEST_BITMAP ); SourceDC.SelectObject(&bmpWhole); for (int x=100; x>=0; x-=100) for (int y=100; y>=0; y-=100) { // создание нового CBitmap CBitmap *destBitmap = new CBitmap(); destBitmap->CreateCompatibleBitmap(&destDC, 100, 100); // установка назначения для destDC CBitmap *oldBitmap = destDC.SelectObject(destBitmap); // копирование destDC.BitBlt(0,0,100,100,&SourceDC ,x,y,SRCCOPY); // добавить результат в вектор m_bitmaps.push_back(destBitmap); // откат destDC.SelectObject(oldBitmap); } bmpWhole.DeleteObject(); destDC.DeleteDC(); SourceDC.DeleteDC(); // рисует все CBitmap из вектора m_bitmaps DrawTest2(); В результате вместо 4 кусков картинок будут нарисованы 4 чёрных квадрата. DrawTest2 рисует корректно, проверил. Что здесь надо исправить чтобы в вектор были загружены части картинки? |
02.07.2013, 16:54 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Я бы начал с проверок что возвращают функции - возможно где-то есть ошибка.
|
02.07.2013, 17:47 | #10 |
Регистрация: 01.07.2013
Сообщений: 8
|
Нашёл решение
Parsing the CBitmap and initializing the vector
m_bitmaps.clear(); m_bitmaps.reserve(4); CDC SourceDC, destDC; SourceDC.CreateCompatibleDC(pMainDC ); CBitmap bmpWhole; bmpWhole.LoadBitmap(IDB_TEST_BITMAP ); SourceDC.SelectObject(&bmpWhole); for (int x=100; x>=0; x-=100) for (int y=100; y>=0; y-=100) { CImage *destImage = new CImage(); destImage->Create(100, 100, 24); destDC.Attach(destImage->GetDC()); destDC.BitBlt(0,0,100,100,&SourceDC ,x,y,SRCCOPY); destDC.Detach(); destImage->ReleaseDC(); m_bitmaps.push_back(destImage); } bmpWhole.DeleteObject(); destDC.DeleteDC(); SourceDC.DeleteDC(); Draw: WORD nShift=0; for (auto iter = m_bitmaps.begin(); iter != m_bitmaps.end(); ++iter, nShift+=110) { CBitmap* pBitmap = CBitmap::FromHandle((*iter)->operator HBITMAP()); CDC memDC; memDC.CreateCompatibleDC(pMainDC); memDC.SelectObject(pBitmap); pMainDC->BitBlt(nShift, 0, 100, 100, &memDC, 0, 0, SRCCOPY); } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
копирование части ячейки | егоровна | Microsoft Office Excel | 6 | 27.08.2012 17:44 |
Копирование части данных ячейки | Doszhan | Microsoft Office Excel | 15 | 04.11.2011 07:49 |
Копирование части строчки | AlexMe | Общие вопросы Delphi | 2 | 26.06.2011 22:20 |
Копирование части диапазона с шагом | valerij | Microsoft Office Excel | 5 | 08.12.2009 17:53 |
Копирование части экрана консоли в C# | Skrutik | Общие вопросы .NET | 3 | 03.03.2009 19:13 |