Изображение выбора цвета созданное программно .NET? - PullRequest
3 голосов
/ 01 марта 2010

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

Если вам известны полезные источники документа или кода по этой теме, они приветствуются.

РЕДАКТИРОВАТЬ: моя идея состоит в том, чтобы создать WPF Picker Control, я знаю, что уже есть некоторые для WPF, Sacha's или из Microsoft Sample . Суть этого вопроса не слишком ориентирована на технологию, которую я буду использовать позже, а на алгоритм для создания изображения .

РЕДАКТИРОВАТЬ 2: Я хотел бы создать что-то вроде градиентного изображения в квадрате программно.

альтернативный текст http://patterns.holehan.org/uploads/gimp_color_chooser.png

1 Ответ

3 голосов
/ 02 марта 2010

Вот некоторые возможности:

  1. Создание изображения с использованием накладывающихся кистей с линейным градиентом.
  2. Создание изображения в виде растрового изображения.
  3. Создание изображения во время рендерингаиспользование пиксельных шейдеров.

Перекрывающиеся градиентные кисти

Для изображения, которое вы показали, вы можете добиться нужного эффекта, используя что-то в этом направлении:

<Grid>
  <Rectangle>
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <GradientStop Offset="0" Color="#FFFF8040" />
        <GradientStop Offset="1" Color="#FFFFFFFF" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>
  <Rectangle>
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
        <GradientStop Offset="0" Color="#FF000000" />
        <GradientStop Offset="1" Color="#00000000" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>
</Grid>

Первая заливка устанавливает цвет, а вторая заливка затемняет его.Очевидно, это можно сделать в чертеже или в VisualBrush.

Это самое простое решение, но оно ограничено в том, что оно может создавать.

Создание изображения в виде растрового изображения

Использование растрового изображения будет работать, но не зависит от разрешения.Вам нужно будет выбрать разрешение для создания растрового изображения.Если вы выберете слишком низкое разрешение, вы получите низкое качество.Если вы выберете слишком высокое разрешение, вы потеряете ресурсы.Автоматический выбор разрешения на основе разрешения экрана и преобразований затруднен, но возможен: необходимо подписаться на несколько событий, чтобы обнаружить изменения разрешения, и использовать TransformToDevice на цели, чтобы определить преобразование из координат WPF в координаты устройства.

После того, как выопределились с разрешением для вашего растрового изображения, остальное легко:

uint[] pixels = new uint[width*height];
for(int x=0; x<width; x++)
  for(int y=0; y<height; y++)
    pixels[y*width + x] = ComputeColor(x, y);

var bitmap = new WritableBitmap(width, height, 96, 96, PixelFormat.Pbgra32, null);
bitmap.WritePixels(new Rect(0, 0, width, height), pixels, width*4, 0);

Использование пиксельных шейдеров

Пиксельные шейдеры фактически работают в самом графическом процессоре, и они работаютза каждый пиксель.Они уже знают целевое разрешение, поэтому вычисление цвета легко.Трудно то, что вы не можете написать алгоритм на C # или VB.NET: вы должны написать его на языке высокоуровневых шейдеров (HLSL), который может стать важной кривой обучения.

Вот некоторыевеб-сайты с примерами пользовательских шейдеров:

пиксельные шейдеры и silverlight библиотека эффектов пиксельных шейдеров WPF интерактивный пример

...