GDI +, используя DrawImage для рисования маски прозрачности исходного изображения - PullRequest
3 голосов
/ 01 октября 2009

Можно ли нарисовать маску прозрачности изображения (то есть закрасить все видимые пиксели постоянным цветом), используя Graphics::DrawImage? Я не ищу ручное сканирование изображения по пикселям и создание отдельного изображения маски, мне интересно, возможно ли нарисовать его непосредственно из исходного изображения.

Я предполагаю, что это должно быть сделано с определенными манипуляциями до ImageAttributes, если возможно вообще.

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

Ответы [ 2 ]

1 голос
/ 12 ноября 2009

Я должен нарисовать изображение с альфа-маской на пиксель и обнаружил, что лучший способ - просто нарисовать базовое изображение RGB, а затем нарисовать непрозрачные части альфа-маски поверх. Вам необходимо отобразить каждый альфа-уровень на альфа-уровень + цвет, чтобы изображение соответствовало каждой детали альфа-маски. Код, который я получил, имеет альфа-маску в виде отдельного 8-битного изображения, но код отрисовки выглядит так:

g.DrawImage(&picture, r.left, r.top, r.Width(), r.Height()); // base image      

if ( AlphaBuf != NULL ) // do we have and alpha mask?
{
Gdiplus::Bitmap mask(Width, Height, Width(), PixelFormat8bppIndexed, AlphaBuf);
picture.GetPalette( palette, picture.GetPaletteSize() );
    // invert - only shows the transparent  
palette->Entries[0] = DLIMAKEARGB(255, 0, 0, 200); // 0 = fully transparent
palette->Entries[255] = DLIMAKEARGB(0, 0, 0, 0); // 255 = fully opaque 

mask.SetPalette(palette);
g.DrawImage(&mask, r.left, r.top, r.Width(), r.Height()); // draw the mask 
}

Мои альфа-маски только полностью прозрачные или полностью непрозрачные, но я думаю, что установка других альфа-значений в палитре позволит вам следовать более градуированной маске.

palette->Entries[1] = DLIMAKEARGB(254, 0, 0, 200);
palette->Entries[2] = DLIMAKEARGB(253, 0, 0, 200);
etc..

Надеюсь, это поможет (или, по крайней мере, имеет смысл :-p)

0 голосов
/ 04 октября 2009

Вы имеете в виду, что вы хотите преобразовать каждый существующий цвет в растровом изображении в один однородный цвет, полностью сохраняя при этом информацию альфа / прозрачности, представленную на изображении?

Если это так, просто используйте следующую цветовую матрицу:

imageAttributes.SetColorMatrix( new ColorMatrix( new float[][] {
    new float[] {0, 0, 0, 0, 0},
    new float[] {0, 0, 0, 0, 0},
    new float[] {0, 0, 0, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {r, g, b, 0, 1}} ) );

где r, g, b находятся в диапазоне от 0 до 1, например:

float r = DesiredColor.R / 255f;
float g = DesiredColor.G / 255f;
float B = DesiredColor.B / 255f;

Я не понимаю, что вы подразумеваете под "было бы плюсом, если для прозрачности может быть пороговое значение", хотя ... так что, возможно, это не тот ответ, который вы искали?

...