Заблокирован
1

Как скопировать HBITMAP в HDC ?

16.01.2014, 18:37. Показов 6552. Ответов 15
Метки нет (Все метки)

Привет!
Есть HDC от окна определённого размера. Есть HBITMAP от картинки намного меньшего размера.
Как один к одному скопировать битмап в контекст в определённое место вне WM_PAIN и всяких процедур оконных?
BitBlt почему то не работает...
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2014, 18:37
Ответы с готовыми решениями:

Скопировать Bitmap в другой HDC
Приветствую! Есть вот такой код: HDC hDC = GetDC(caller->window()); HDC memDC =...

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых "Библиотека системного программиста" рисование битовых...

BitBlt. Скопировать изображение сначала из SecondMemhdc в Memhdc, а затем из него в hdc
HDC hdc, Memhdc, SecondMemhdc; HBITMAP picture; picture = (HBITMAP)...

Как получить Bitmap из HBITMAP
Вот такой код должен получать снимак экрана и выводить его в pictureBox HDC scrdc, memdc; HBITMAP...

15
Заблокирован
16.01.2014, 20:44 2
Привет!
BitBlt почему то не работает...
Его одного мало. Он сам по себе только с дескрипторами контекстов работает, то есть с HDC.
Поэтому нужно ещё так или иначе преобразовать битмап в контекст.
вот пример
C++
1
2
3
4
5
6
7
8
9
10
void ScreenDraw(HBITMAP bmp, int X, int Y, int W, int H)
{
  HDC screen = GetDC(NULL);
  HDC bitmap = CreateCompatibleDC(screen);
  HBITMAP old = (HBITMAP)SelectObject(bitmap, bmp);
  BitBlt(screen, X, Y, W, H, bitmap, 0, 0, SRCCOPY);
  SelectObject(bitmap, old);
  DeleteDC(bitmap);
  ReleaseDC(NULL, screen);
}
взял отсюда http://forum.*.ru/index.php?topic=20145.0
самому неохота - приболел
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
16.01.2014, 20:47 3
А смысл вне паинта что то выводить? Сотрётся же, лучше в том месте, где хотел выводить, сними действительность с региона, или со всего окна, а в WM_PAINT уже выводи.
0
Заблокирован
16.01.2014, 22:25 4
Цитата Сообщение от taras atavin Посмотреть сообщение
А смысл вне паинта что то выводить?
UpdateLayeredWindow
Тоесть я подгружаю кучу битмапов с хардиска и получаю соответственно на них HBITMAP хэндлы. Далее делаю CreateCompatibleDC(NULL) для каждого битмапа, выбираю в него SelectObjectom этот битммап и хочу всё это барахло скопировать в общий HDC - из которого и будет инфа на Layered Windows копироваться...

Добавлено через 52 минуты
Всё GDI в топку, глянул на GDI+ - вещь! (я б конечно использовал DirectX, но я данный момент на него запрет )

Пока ещё не добрался до сути моего топика, но думаю тут всё делается просто. Может кто ткнёт носом, как скопировать несколько картинок в одну? Ну так сказать смиксовать?

Graphics graphics(hdc); -создал объект Graphics, могу туда закинуть картинку graphics.DrawImage(&image, 60, 10);, при попытке закинуть ещё одну - она старую полностью выкидывает, а хотелось бы, чтоб хотя бы без всяких эффектов, новая картинка ложилась на старую...

(в простом WinAPI GDI Это делается етодом получения битов таргета и битмапа - но это такой гемор)
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.01.2014, 07:41 5
NULL в параметре, то есть вывод не в окно, а прямо на экран?
0
Заблокирован
17.01.2014, 11:15  [ТС] 6
ааа всё, забил я на GDI, буду юзать GDI+

Добавлено через 11 минут
у меня тут другой вопрос возник, можно ли как то при создании DC и последующем создании DIB SECTION сразу залить его каким - то определённым цветом, а не чёрным, как изначально (ну там нули все)

C++
1
2
3
4
5
6
7
8
9
10
hBackBufferDC = CreateCompatibleDC(hFrontBufferDC);
BITMAPINFO bi;
memset(&bi, 0, sizeof(bi));
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biWidth = kbData[curKbID].width;
bi.bmiHeader.biHeight = -kbData[curKbID].height;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biPlanes = 1;
hBackBuffer = CreateDIBSection( hBackBufferDC, &bi, DIB_RGB_COLORS, (void**)&backBufferBytes, NULL, 0 );
Добавлено через 34 секунды
можно конечно перебрать все байты и установить нужный цвет, но хотелось бы без этого обойтись ...
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2014, 13:27 7
Так вы помоему заливаете через Memset, где цвет заливки у вас 0. Измените его на другой, и возможно это сработает.
0
Модератор
Эксперт по электронике
8756 / 6546 / 887
Регистрация: 14.02.2011
Сообщений: 22,962
17.01.2014, 13:37 8
Цитата Сообщение от ляга Посмотреть сообщение
ааа всё, забил я на GDI,
разумеется забил, раз разобраться в сущности не можешь
HBITMAP и HDC это разные сущности, ты бы еще HWND суда приплел (а есть еще HICON HFONT имя им легион)
ты должен создать свой(новый контекст рисования) приатачить туда картинку и только потом копировать этот контекст в HDC, в любом учебнике написано
Цитата Сообщение от ляга Посмотреть сообщение
буду юзать GDI+
через сколько на него забьешь?
0
Заблокирован
17.01.2014, 14:24  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
через сколько на него забьешь?
нее - не забью, там очень много интересный плюшек, мне он понравился. Например загрузка jpg, png, эффекты всякие и тд (что то вроде Direct2D, но начиная с WinXP).
Цитата Сообщение от ValeryS Посмотреть сообщение
ты должен создать свой(новый контекст рисования) приатачить туда картинку
приатачить картинку или создать в на его основание DIB section, как в верхнем посте у меня.. Вроде понял.
Цитата Сообщение от Izual Посмотреть сообщение
Так вы помоему заливаете через Memset, где цвет заливки у вас 0. Измените его на другой, и возможно это сработает.
ну memset-ом можно все байты одинаково заливать, тоесть по сути получится залить ТОЛЬКО красным, синим или зелёным. Там же байты идут в формате BGRA, тоесть Blue,Green,RedmAlpha, и тд (тоесть 4-ками как бы). Ладно, побайтово буду заливать в цикле

ValeryS, а не подскажете, как правильно удалять объекты GDI+ ? Простым delete?

P.S.: на простой GDI я конечно не забью, я их буду миксовать - тоесть GDI/GDI+, думаю это оптимальный вариант
0
Модератор
Эксперт по электронике
8756 / 6546 / 887
Регистрация: 14.02.2011
Сообщений: 22,962
17.01.2014, 14:38 10
Цитата Сообщение от ValeryS Посмотреть сообщение
приатачить туда картинку
насчет приатачить я что то погнал
нужно присоединить
C++
1
2
3
 HGDIOBJ hOldBitmap  = SelectObject(hBDC, // HDC созданого контекста рисования
  hBitmap//HBITMAP контекст картинки
 );
Добавлено через 3 минуты
Цитата Сообщение от ляга Посмотреть сообщение
ну memset-ом можно все байты одинаково заливать, тоесть по сути получится залить ТОЛЬКО красным, синим или зелёным.
мемсет заливает все байты
а COLORREF это структура
unsigned char R;
unsigned char G;
unsigned char B;
unsigned char reserwed;

для того чтобы залить все красным ты должен дать в первый байт 255 в остальные 0

Добавлено через 8 минут
Цитата Сообщение от ляга Посмотреть сообщение
приатачить картинку или создать в на его основание DIB section, как в верхнем посте у меня.. Вроде понял.
вот примерный текст
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
// Функция простой отрисовки изображения
void DrawImage(HDC hDC,     // Дескриптор контекста где рисуем
        HBITMAP hBitmap,    // Дескриптор изображения, который рисуем
        int x,              // Координаты отрисовки
        int y)
{
    // Создаем контекст для отрисовываемого изображения
    HDC     hBDC        = CreateCompatibleDC(hDC);
    // Назначаем изображение в этот контекст, сохраняем предыдущее изображение в hOldBitmap
    HGDIOBJ hOldBitmap  = SelectObject(hBDC, hBitmap);
    // Объявляем переменную типа струкрура BITMAP
    BITMAP bInfo;
    // Записываем в поля переменной bInfo информацию об изображении.
    // Нас интересует ширина и высота
    GetObject(hBitmap, sizeof(bInfo), &bInfo);
    // Копирование содержимого контекста изображения (hBDC) в целевой контекст(hDC)
    BitBlt(hDC,                                 // Дескриптор целевого контекста (куда рисуем)
            x,y,bInfo.bmWidth,bInfo.bmHeight,   // Прямоуглоьная область целевого контекста
            hBDC,                               // Дескриптор исходного контекста (который рисуем)
            0,0,                                // Координаты левого верхнего угла исходного контекста
            SRCCOPY);                           // Тип наложения (SRCCOPY - замена пикселей целевого на пиксели исходного контекстов)
    // Восстанавливаем предыдущее изображение в созданный контекст
    SelectObject(hBDC, hOldBitmap);
    // Удаляем контекст изображения - он больше не нужен
    DeleteDC(hBDC);
}
листинг не мой, взят на просторах интернета но по моему все понятно
вот ссылка http://o3gl.com/anichkov/win_bitmap.html
Цитата Сообщение от ляга Посмотреть сообщение
нее - не забью, там очень много интересный плюшек, мне он понравился.
за плюшки надо платить
быстродействием, объемом памяти, отдельной DLLкой
посмотри этот сайт
http://www.firststeps.ru/
много интересного
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.01.2014, 15:37 11
нее - не забью, там очень много интересный плюшек
После знакомства с DirectX, вы удивитесь что он может вам дать. Например я вот создал тему в разделе DirectX но к сожалению никто не помог, однако идея и дальнейшее развитие данной тематики может привести к полному уничтожению "3д" как переходу эпох 2д и 3д, но без полигонов и без шейдеров, которые только лишь своими требованиями продвигают идею "запланированного устаревания"(не точно выразился, но смысл в том что, GTA5 должна идти на компьютерах поддерживающих GTA4, естественно с менее качественной графикой, но идти должна, а на деле?).
0
4201 / 1793 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.01.2014, 15:39 12
Не должна.
0
Заблокирован
17.01.2014, 15:51  [ТС] 13
Цитата Сообщение от Izual Посмотреть сообщение
После знакомства с DirectX, вы удивитесь что он может вам дать
Бугага. Я отлично знаю DirectX (7...11.1). На данный момент кое - кто свыше попросил меня его не использовать... А так бы...
Ссылку на тему дай, я тебе помогу
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.01.2014, 04:23 14
Цитата Сообщение от ляга Посмотреть сообщение
Бугага. Я отлично знаю DirectX (7...11.1). На данный момент кое - кто свыше попросил меня его не использовать... А так бы...
Ссылку на тему дай, я тебе помогу
DirectDraw - DDSURFACEDESC2 | DDSD_LPSURFACE. Рисуются только оттенки белого-чёрного

А можно поинтересоваться почему "кто то с выше" сказал не пользоваться DirectX? Ведь GDI по сравнению с ним медленне намного...(по крайней мере так утверждает Фленов)
0
Заблокирован
18.01.2014, 08:54 15
Цитата Сообщение от Izual Посмотреть сообщение
А можно поинтересоваться почему "кто то с выше" сказал не пользоваться DirectX?
по тому что этот кто - то - мой босс
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
18.01.2014, 14:53 16
Цитата Сообщение от Дождь Посмотреть сообщение
по тому что этот кто - то - мой босс
Я почему то подумал что вы имели ввиду какого то профессионала, который аргументировал это. Ну или как иногда бывает - приснится во сне...(не давно было такое, это как озарение свыше)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2014, 14:53
Помогаю со студенческими работами здесь

Как узнать HDC минимизированного окна?
День всем добрый! Я определяю HDC нужного мне окна таким образом: HWND h_brausera; HDC...

Как из hdc перенести изображение в StdPicture
Перелопатил уже море страниц в интернете, но не нашёл не 1 решения........ Надо чтоб конечный...

Как сделать Picture1.hDC динамичным?
Privet. podskajitye pojalusta u minya est takoy kod. Private Declare Function SetPixelV Lib...

Как получить цвет точки из HBITMAP
Как связать HBITMAP и GetPixel()/SetPixel? Мне нужно сделать фильтры для изображения, а я не знаю...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru