Как я могу отобразить монохромное растровое изображение в цвете в WPF? - PullRequest
2 голосов
/ 27 февраля 2011

В Win32 дней, если бы у меня был монохроматический растровый рисунок, который для всех намерений и целей является просто растровой маской, я мог бы отобразить этот растровый образ в DeviceContext. То, что произошло бы, это каждый пиксель, где был «0», который он отображал как прозрачный, и каждый пиксель, где был «1», он отображал в текущем выбранном цвете. Это было очень удобно.

Однако после нескольких недель поиска я не увидел ничего подобного в WPF.

Теперь я собирался просто свернуть свой собственный класс MonochromeBitmapImage, но подумал, что если кто-нибудь узнает другой способ сделать это, то это все вы, S.O. пользователи, поэтому у меня вопрос ... как в WPF я могу отобразить монохромное растровое изображение с одним значением определенного цвета, а другое прозрачным?

Ответы [ 2 ]

4 голосов
/ 28 февраля 2011

Очень похожая функция - OpacityMask для UIElement.Он отобразит части, которые не прозрачны в OpacityMask.Может использоваться с

  • Кистями - SolidColorBrush и т. Д.
  • Визуальными изображениями - VisualBrush
  • Изображения - ImageBrush
  • и т. Д.

Вот пример с Button, использующим ImageBrush

<Button Content="Opacity Mask">
    <Button.OpacityMask>
        <ImageBrush ImageSource="C:\OpacityRect.png"/>
    </Button.OpacityMask>
</Button>

enter image description here

2 голосов
/ 28 февраля 2011

Это зависит от того, нужно ли вам использовать монохромные растровые изображения или вы просто хотите иметь возможность перекрасить изображение.Если вы можете использовать любой формат изображения, я бы использовал png с альфа-каналом, тогда вы можете использовать изображение как OpacityMask, код не требуется.Используя изображение в качестве OpacityMask, вы можете легко изменить цвет, использовать градиент или ImageBrush.

    <Rectangle Fill="Blue">
        <Rectangle.OpacityMask>
            <ImageBrush ImageSource="..." />
        </Rectangle.OpacityMask>
    </Rectangle>

Если вам нужно использовать 1-битные растровые изображения, довольно просто преобразовать их в индексированный формат с помощьюПользовательская палитра.Вы можете установить нужный цвет в палитре или просто выбрать что-нибудь и использовать его в качестве OpacityMask.FormatConvertedBitmap, по-видимому, нуждается в другом формате, просто другая палитра не имела никакого эффекта.

public static FormatConvertedBitmap Recolor(BitmapImage b, Color c)
{
    return new FormatConvertedBitmap(b, PixelFormats.Indexed2, new BitmapPalette(new List<Color>() { Colors.Transparent, c }), 0);
}

Другой вариант - это PixelShader, это немного излишне для таких вещей, но для более сложных манипуляций они полезны.

...