Изображения и геометрия в C # - PullRequest
1 голос
/ 02 декабря 2009

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

Каков наилучший способ сделать это? Я думал об использовании DirectX, но я видел, что он немного устарел. GDI + разрешается?

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 02 декабря 2009

DirectX будет излишним, вы должны использовать GDI + (он же System.Drawing).

3 голосов
/ 02 декабря 2009

использовать BackgroundImage в качестве слоя priamry (переопределение OnPaintBackground на форме) и OnPaint переопределяет «основной» слой с вашими точками.

1 голос
/ 02 декабря 2009

Да, GDI + будет достаточно. Все, что вам нужно, это иметь два изображения:

  • Один будет содержать фон и будет «только для чтения»;
  • Другой не будет иметь фона и будет содержать только точки, которые вы нарисовали.

Вам нужно будет просто нарисовать одно изображение поверх другого, а затем отобразить результат пользователю (не забывайте использовать двойную буферизацию).

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

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

1 голос
/ 02 декабря 2009

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

Не совсем то, что вы просите, но эта статья может дать вам несколько советов (если только я вас совершенно не понимаю).

http://www.codeproject.com/KB/WPF/ImageCropper.aspx

0 голосов
/ 02 декабря 2009

Как насчет этого?

<Border>
    <Border.Background>
        <ImageBrush ImageSource="foo.jpg" />
    </Border.Background>
    <Canvas Background="Transparent"/>
</Border>

Отобразите изображение на заднем плане и нарисуйте ваши точки в Canvas, который лежит поверх этого изображения.

Edit: Это будет выглядеть так в C #:

Border border = new Border();
Canvas canvas = new Canvas()
{
    Background = Brushes.Transparent
};
grid.AddChild(border);
border.Child = canvas;
border.Background = new ImageBrush();

Тогда вам нужно всего лишь загрузить ваше изображение в рамку. Backgound, завернутый в ImageBrush.

...