Доступ к одному пикселю в C # - PullRequest
3 голосов
/ 24 января 2009

Я сейчас работаю над школьным проектом. Это должно быть программное обеспечение для редактирования 3D (как очень минимизированная версия Maya). Я должен написать это на C #, используя «Windows Application Project». Я собираюсь реализовать все 3D-вещи самостоятельно, от проекций до затенения. У меня вопрос, как я могу получить прямой доступ к одному пикселю в приложении C # Windows? Я знаю, что у меня будет порт основного вида в окне. Но я еще не решил, как это будет сделано. Есть ли встроенный объект, который я могу использовать, который позволит мне определить границы порта просмотра, а затем раскрасить каждый пиксель по отдельности? (Я просто стреляю в темноте, я мало что знаю о C #. Я в основном программирую на C)

Спасибо, Малки.

Ответы [ 5 ]

3 голосов
/ 24 января 2009

Используя метод CreateGraphics (), это должно работать:

Bitmap b = new Bitmap(Width, Height, this.CreateGraphics());
//pixel is:
Color c = b.GetPixel(x, y);

Чтобы установить пиксель для определенного цвета, используйте это вместо Color c = b.GetPixel(x,y):

b.SetPixel(x, y, c); // where c is a Color

Если вам нужен видовой экран, поместите панель или PictureBox (возможно, с Dock: Fill), затем используйте:

Bitmap b = new Bitmap(viewport.Width, viewport.Height, viewport.CreateGraphics());

вместо первой строки, использованной ранее.

Но из того, что вы хотите сделать, я думаю, что было бы лучше использовать событие OnPaint:

void pnlViewport_Paint(object sender, PaintEventArgs e) {
    if ( e.ClipRectange.Width < 1 || e.ClipRectangle.Height < 1 ) return;
    Bitmap b = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height, e.Graphics);
    // ...
}

Это событие срабатывает каждый раз, когда необходимо нарисовать элемент управления. Первая строка проверяет, является ли рисуемая область пустой - это не только сэкономит процессорное время, но и может привести к сбою вашего приложения - вы получаете его для создания растрового изображения 0x0.

РЕДАКТИРОВАТЬ : Да, это можно изменить, если Dock = DockStyle.Fill; По мере изменения размера вашего окна элемент управления расширяется, чтобы заполнить пространство. Затем перекрашивается - стреляет в событие.

РЕДАКТИРОВАТЬ 2 : Как отмечалось другими, это все еще медленно. Звучит так, как будто это требование делать 3D-рисование самостоятельно, поэтому, возможно, SDL.NET (который, я думаю, может использовать аппаратное ускорение) - это путь. Он даже имеет (медленный) SurfaceControl для использования.

2 голосов
/ 24 января 2009

Кристиан Граус имеет несколько хороших статей о графических манипуляциях на www.CodeProject.com Они должны ответить на ваши вопросы.

1 голос
/ 24 января 2009

Приложение 3D-редактора должно не только рисовать на экране, но и чертовски быстро. Стандартный подход в .NET будет использовать классы Bitmap и Graphics, как описано в person-b . Но это будет медленно. Вы можете улучшить скорость, используя Bitmap.LockBits () и умные оптимизации, но в целом я сомневаюсь, что вы все равно получите необходимую производительность. Вы съедите весь процессор и по-прежнему будете зависать со скоростью менее 10-20 кадров в секунду (число - дикое предположение). Аппаратное ускорение - это реальный путь. shuggycouk имеет ссылки в правильном направлении.

К сожалению, аппаратный подход также уберет проекции и затенение, потому что для этого есть оборудование. Так что я не знаю, можете ли вы использовать это ... Возможно, ищите информацию о "оверлеях" в .NET. Именно так все медиаплееры показывают фильмы. Это определенно намного быстрее, чем стандартный GDI / GDI + и все еще 2D. Или, возможно, вы могли бы сделать хитрый обходной путь с DirectX - используйте его для рисования 2D фигур, которые вы определяете сами. ;)

0 голосов
/ 24 января 2009

Если вам нужна скорость в пикселях, высокоскоростной графический контроль для сети или MFC может дать несколько советов.

0 голосов
/ 24 января 2009

Если вы делаете 3d, то имеет смысл использовать аппаратное ускорение, предоставляемое почти каждым графическим процессором под солнцем в наши дни. Если вы рады, что у вас есть API для Windows, 3D-API DirectX теперь доступны через управляемых оболочек . Также имеется набор инструментов XNA , разработанный в первую очередь для игр, но он предоставляет множество примеров того, как выполнять ускоренную отрисовку в Direct-X 3D из c #.

...