Сведения о вопросе

rjevskii

20:32, 22nd August, 2020

Теги

Альфа-смешивание цветов в компактной структуре .NET 2.0

Просмотров: 585   Ответов: 5

В полной платформе .NET вы можете использовать метод Color.FromArgb() для создания нового цвета с Альфа-смешиванием, например::

Color blended = Color.FromArgb(alpha, color);

или

Color blended = Color.FromArgb(alpha, red, green , blue);

Однако в Compact Framework (2.0 конкретно) ни один из этих методов не доступен, вы только получаете:

Color.FromArgb(int red, int green, int blue);

и

Color.FromArgb(int val);

Первый из них, очевидно, даже не позволяет ввести Альфа-значение, но документация для последнего показывает, что "val"-это 32-битное значение ARGB (как 0xAARRGGBB в отличие от стандартного 24-битного 0xRRGGBB), поэтому было бы разумно просто построить значение ARGB и передать его функции. Я попробовал это сделать со следующим:

private Color FromARGB(byte alpha, byte red, byte green, byte blue)
{
    int val = (alpha << 24) | (red << 16) | (green << 8) | blue;
    return Color.FromArgb(val);
}

Но независимо от того, что я делаю, Альфа-смешивание никогда не работает, результирующий цвет всегда имеет полную непрозрачность, даже если значение альфа равно 0.

Кто-нибудь получил это, чтобы работать на компактной основе?



  Сведения об ответе

lourence

20:22, 5th August, 2020

По-видимому, это не совсем так просто , но все же возможно, если у вас есть Windows Mobile 5.0 или новее.


  Сведения об ответе

+-*/

10:22, 15th August, 2020

я беру этот код и добавляю его

device.RenderState.AlphaBlendEnable = true;
device.RenderState.AlphaFunction = Compare.Greater;
device.RenderState.AlphaTestEnable = true;
device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
device.RenderState.SourceBlend = Blend.SourceAlpha;
device.RenderState.DiffuseMaterialSource = ColorSource.Material;

в инициализированном режиме и это работает очень хорошо, спасибо


  Сведения об ответе

qwerty101

14:57, 16th August, 2020

Видимо, это не совсем так просто, но все же возможно, если вы есть Windows Mobile 5.0 или новее.

Wow...definitely не стоит того, если я должен поместить весь этот код В (и сделать родной interop!) Хотя хорошо бы знать, Спасибо за ссылку.


  Сведения об ответе

DO__IT

07:25, 28th August, 2020

CE 6.0 не поддерживает Альфа-смешивание. WM 5.0 и выше делают, но не через .NET CF, вам нужно будет P / Invoke GDI вещи, чтобы сделать это. Там есть готовые решения, однако, если вам интересно, я могу выкопать ссылки завтра в офисе. В настоящее время мне приходится работать с CE 6.0, поэтому я не думаю о них.

Если вы используете CE 6.0, вы можете использовать псевдопрозрачность, зарезервировав цвет фона прозрачности (например ff00ff или что-то подобное уродливое) и использование этого в Ваших изображениях для прозрачных областей. Затем ваши родительские элементы управления должны реализовать простой интерфейс, который позволяет повторно рисовать соответствующую часть графического буфера дочерних элементов управления. Обратите внимание, что это не даст вам истинный "alpha channel", а скорее просто жесткий бинарный вид прозрачности.

Все не так плохо, как кажется. Для начала взгляните на OpenNETCF ImageButton. Если вы собираетесь использовать этот метод, у меня есть несколько расширенная версия некоторых простых элементов управления с этой техникой, лежащей вокруг, если вам интересно.

Еще один недостаток заключается в том, что этот метод основан на родительском элементе управления, реализующем специальный интерфейс, и последующих элементах управления, использующих его в чертеже. Так что с закрытыми исходными компонентами (т. е. Также запасными компонентами winforms) вам не повезло.


  Сведения об ответе

crush

16:09, 18th August, 2020

Там есть сайт codeplex , который, кажется, делает тяжелую работу com interop для вас:


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться