Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] *GdiPlus*| маски прозрачности

Ответить
Настройки темы
Win32 API - [решено] *GdiPlus*| маски прозрачности
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Здравствуйте всем! есть такая задача, дано:
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

 
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


нашёл как смешивать текстуры на одном полигоне
Код: Выделить весь код
d3dev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
d3dev->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
для чего это - не понимаю, но без него не работает. Как альфаблендить полигон с фоном?

Отправлено: 15:02, 02-11-2009 | #3

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


разобрался
Код: Выделить весь код
    co_good(d3dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA));
    co_good(d3dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA));

Отправлено: 14:38, 05-11-2009 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - [решено] *GdiPlus*| маски прозрачности

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Восстановление прозрачности фона иконок на рабочем столе 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




 
Переход