|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] *GdiPlus*| маски прозрачности |
|
Win32 API - [решено] *GdiPlus*| маски прозрачности
|
![]() Ветеран Сообщения: 1180 |
Здравствуйте всем! есть такая задача, дано:
1. изображение RGB №1 (без альфа-канала) 2. изображение RGB №2 (непрозрачное) 3. чёрно-белое изображение A №3 требуется получить непрозрачное изображение №4, каждый бит которого image4 = image3/255*image2 + (255-image3)/255*image1, где image1, image2, image4 - соответственно значения битов, image3 - та самая прозрачность. Пока склоняюсь к способу перемножения битов вручную. Тогда (по внутренним соображениям) возникает вопрос, как быстро и качественно отмасштабировать картинку? А, и ещё, всё это должно уметь работать в режиме службы на win Xp, win 2000 server. А я вот не помню, работает в этом случае ускорение DirectX или нет... |
|
Отправлено: 18:48, 29-10-2009 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Решил всё-таки сделать через Direct3D. Не поучается отрисовать полупрозрачный прямоугольник
![]() job_t::job_t() : _fps(30) { WNDCLASS wcla = {0, _wnd_proc, 0, 4, GetModuleHandle(0), LoadIcon(0, IDI_APPLICATION), LoadCursor(0, IDC_ARROW), /*HBRUSH(COLOR_WINDOW + 1)*/0, 0, L"Window"}; _atom = reinterpret_cast<const wchar_t*>(RegisterClass(&wcla)); _window = CreateWindowEx(0, _atom, L"GDI+ Window", WS_OVERLAPPEDWINDOW/*|WS_VISIBLE*/, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0, 0); SetTimer(_window, 101, 1000/_fps, 0); d3d.reset(Direct3DCreate9(D3D_SDK_VERSION)); co_throw_error(d3d.empty()); D3DPRESENT_PARAMETERS d3params = D3DPRESENT_PARAMETERS(); d3params.BackBufferFormat = D3DFMT_A8R8G8B8; d3params.Windowed = true; d3params.SwapEffect = D3DSWAPEFFECT_DISCARD; d3params.hDeviceWindow = _window; co_throw_error(d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _window, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3params, d3dev.prepare_storage())); ShowWindow(_window, SW_SHOW); } void job_t::_paint() { d3dev->Present(0, 0, 0, 0); } void job_t::_render() { static area_t _area1(L"test.jpg", 0., 0.), _area2(L"test2.jpg", 50., 50.); d3dev->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0 ); co_good(d3dev->BeginScene()); // всякие варианты перепробовал: // co_throw_error(d3dev->SetRenderState(D3DRS_LIGHTING, false)); // d3dev->SetRenderState(D3DRS_ALPHABLENDENABLE, true); // d3dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); // d3dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_DESTALPHA); // d3dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); // d3dev->SetRenderState(D3DRS_ALPHABLENDENABLE, true); d3dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO); // d3dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); // co_throw_error(d3dev->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1)); _area1.render(); _area2.render(); co_good(d3dev->EndScene()); } area_t::area_t(const wchar_t* img, float x, float y) { co_throw_error(D3DXCreateTextureFromFile(d3dev.get(), img, _texture.prepare_storage())); co_throw_error(d3dev->CreateVertexBuffer(sizeof(vertex_t)*6, 0, vertex_fvf, D3DPOOL_DEFAULT, _vertices.prepare_storage(), 0)); vertex_t* vertex_mem; co_throw_error(_vertices->Lock(0, sizeof(vertex_t)*6, (void**)&vertex_mem, 0)); static float _tryangles[12] = {0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0}; static long _colors[6] = { 0xffffffff,0xffffffff,0xff80ffff, 0xffffffff,0x80ffffff,0x00ffffff}; for(unsigned p=0; p<6; ++p,++vertex_mem) { vertex_mem->x = x + _tryangles[p*2+0]*640; vertex_mem->y = y + _tryangles[p*2+1]*480; vertex_mem->z = 1.; vertex_mem->rhw = 1.; vertex_mem->color = _colors[p]; vertex_mem->tu = _tryangles[p*2+0]; vertex_mem->tv = _tryangles[p*2+1]; } co_throw_error(_vertices->Unlock()); } void area_t::render() { co_good(d3dev->SetTexture(0, _texture.get())); co_good(d3dev->SetStreamSource(0, _vertices.get(), 0, sizeof(vertex_t))); co_good(d3dev->SetFVF(vertex_fvf)); co_good(d3dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2)); } // код для разъяснений в предыдущем куске кода void co_throw_error(HRESULT hr); bool co_good(HRESULT hr); void log_message(const wstring&); wstring wstr(const string&); //--------------------------------------------------------------------------- template<class Interface> class co_deleter { public: ~co_deleter() { reset(0); } co_deleter(Interface* ptr=0) throw() : _ptr(ptr) { } co_deleter(const co_deleter& deleter) throw() : _ptr(co_deleter._ptr) { if (_ptr) _ptr->AddRef(); } void reset(Interface* ptr) throw() { if(_ptr) _ptr->Release(); _ptr = ptr; } Interface** prepare_storage() { reset(0); return &_ptr; } bool empty() throw() { return _ptr==0; } Interface* get() throw() { return _ptr; } Interface* operator->() throw() { return _ptr; } private: Interface* _ptr; }; //--------------------------------------------------------------------------- class area_t { public: enum { vertex_fvf = D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1, vertex_triangles = 2, vertex_count = 3*vertex_triangles }; struct vertex_t { float x, y, z, rhw; unsigned color; float tu, tv; }; area_t(const wchar_t* img, float x, float y); void render(); private: co_deleter<IDirect3DVertexBuffer9> _vertices; co_deleter<IDirect3DTexture9> _texture; }; class job_t { public: // ~job_t(); job_t(); void operator()(); private: const wchar_t* _atom; HWND _window; unsigned _fps; void _render(); void _paint(); void _init_vertex_buffer(); static long __stdcall _wnd_proc(HWND hwnd, unsigned code, unsigned wparam, long lparam); }; |
Отправлено: 15:16, 30-10-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:02, 02-11-2009 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать |
Отправлено: 14:38, 05-11-2009 | #4 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] Восстановление прозрачности фона иконок на рабочем столе | Blast | Microsoft Windows 2000/XP | 59 | 12-06-2015 17:15 | |
Разное - [решено] Автоматическое отключение прозрачности aero при переходе на аккумулятор | Plazmatics | Microsoft Windows 7 | 7 | 01-10-2009 01:22 | |
[решено] GDIPlus - стирание нарисованого на форме при появлении окошек над формой | crashtuak | AutoIt | 4 | 08-08-2009 20:23 | |
FAQ - [решено] Ping при использовании нестандартной маски сети. | lxa85 | Сетевые технологии | 5 | 02-07-2008 11:49 | |
[решено] Задачка 8) (Субсети, маски) | bool | Сетевые технологии | 2 | 17-07-2006 12:12 |
|