[GDI+] SetPixel
От: Mag Россия  
Дата: 31.10.03 12:06
Оценка:
Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?
... << RSDN@Home 1.1 beta 2 >>
Re: [GDI+] SetPixel
От: AndreyFedotov Россия  
Дата: 31.10.03 12:29
Оценка: 1 (1)
Здравствуйте, Mag, Вы писали:

Mag>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?


Увы... Прав... Как нет и GetPixel. Но зачем она тебе?
Вообще то, как мне кажется, если она потребовалось — что то скорее всего программ спроектирована не особо удачно.
Посмотри — возможно что-то можно сдлать иначе.
И если всё- таки надо, то:
Graphics имеет в своём составе GetHDC: получаешь контекст изображения и SetPixel'ишь его маниакально...
Только не забудь его потом отпустить...
Вообще советую посмтреть в MSDN — там даже пример есть, довольно хороший.
С Уважением, Андрей
Re: [GDI+] SetPixel
От: Kh_Oleg  
Дата: 31.10.03 12:55
Оценка: 15 (2)
Здравствуйте, Mag, Вы писали:

Mag>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?


Прав, конечно!
Дело в том, что Graphics отвязан от устройства, на котором он, в конечном счете, будет рисовать. А пиксели — это device-dependent штука, вот в точечном рисунке (Bitmap) они есть — там и SetPixel есть. Кстати, именно поэтому в GDI+ нет растровых операций.

На самом деле, нарисовать пиксель в GDI+ можно:
pGraphics->SetPageUnit(PixelUnit);
pGraphics->FillRectangle(&SolidBrush(...), Rect(x, y, 1, 1));

Причем именно FillRectangle, DrawRectangle не поможет.

Олег.
Re[2]: [GDI+] SetPixel
От: Mag Россия  
Дата: 31.10.03 13:38
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

AF>Здравствуйте, Mag, Вы писали:


Mag>>Что-то я торможу... Имея, объект Graphics можно нарисовать линию (DrawLine), но нельзя сделать SetPixel, странно... Или я не прав?


AF>Увы... Прав... Как нет и GetPixel. Но зачем она тебе?

Отрисовка у меня идёт по WM_PAINT'у (C#). Необходимо отрисовывать точки некоего графика.

AF>Вообще то, как мне кажется, если она потребовалось — что то скорее всего программ спроектирована не особо удачно.

Возможно. Есть ещё вариант отрисовывать на Image'е, но не очень удобно, т.к. отрисовка многослойная и динамичная.

AF>Посмотри — возможно что-то можно сдлать иначе.

Подумаю... Пока реализовал единичным элипсом.

AF>И если всё- таки надо, то:

AF>Graphics имеет в своём составе GetHDC: получаешь контекст изображения и SetPixel'ишь его маниакально...
AF> Только не забудь его потом отпустить...
AF> Вообще советую посмтреть в MSDN — там даже пример есть, довольно хороший.
Так мне не охото к обычному GDI возвращаться...
... << RSDN@Home 1.1 beta 2 >>
Re[3]: [GDI+] SetPixel
От: AndreyFedotov Россия  
Дата: 31.10.03 13:44
Оценка:
Здравствуйте, Mag, Вы писали:

Mag>Так мне не охото к обычному GDI возвращаться...


Тогда придётся возиться с функциями Bitmap, как уже предлагалось.
Скобки:


hDC = Gr.GetHDC()
SetPixel( hDC, x, y, color );
ReleaseDC( hDC );



По-моему дешевле...

С Уважением, Андрей
Re[4]: [GDI+] SetPixel
От: Mag Россия  
Дата: 31.10.03 14:47
Оценка: 6 (1)
Здравствуйте, AndreyFedotov, Вы писали:

AF>Здравствуйте, Mag, Вы писали:


Mag>>Так мне не охото к обычному GDI возвращаться...


AF>Тогда придётся возиться с функциями Bitmap, как уже предлагалось.

AF>Скобки:

AF>
AF>hDC = Gr.GetHDC()
AF>SetPixel( hDC, x, y, color );
AF>ReleaseDC( hDC );
AF>


AF>По-моему дешевле...

Тоже хорошее решение. Но мне больше приглянулось решение Олега Харитонова — единичный закрашенный прямоугольник.
... << RSDN@Home 1.1 beta 2 >>
Re[5]: [GDI+] SetPixel
От: AndreyFedotov Россия  
Дата: 31.10.03 14:51
Оценка:
Здравствуйте, Mag, Вы писали:

Mag>Здравствуйте, AndreyFedotov, Вы писали:


AF>>Здравствуйте, Mag, Вы писали:


Mag>>>Так мне не охото к обычному GDI возвращаться...


AF>>Тогда придётся возиться с функциями Bitmap, как уже предлагалось.

AF>>Скобки:

AF>>
AF>>hDC = Gr.GetHDC()
AF>>SetPixel( hDC, x, y, color );
AF>>ReleaseDC( hDC );
AF>>


AF>>По-моему дешевле...

Mag>Тоже хорошее решение. Но мне больше приглянулось решение Олега Харитонова — единичный закрашенный прямоугольник.

Согласен. Если точек — мало и если нужна возможность увеличить их размер, то его решение — лучше. Правда в этом случае — может быть лучше окружность 1-го радиуса... Но вот если точек может быть много — то SetPixel — быстрее, однозначно...
Re[6]: [GDI+] SetPixel
От: Kh_Oleg  
Дата: 31.10.03 15:07
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

Mag>>>>Так мне не охото к обычному GDI возвращаться...

AF>>>Тогда придётся возиться с функциями Bitmap, как уже предлагалось.
Вот Bitmap.SetPixel() точно очень медленная штука, проверено. Мы с этим столкнулись в нашем проекте. Пришлось отказаться от SetPixel и использовать LockBits(). Это если строго в рамках GDI+.

AF>Согласен. Если точек — мало и если нужна возможность увеличить их размер, то его решение — лучше. Правда в этом случае — может быть лучше окружность 1-го радиуса... Но вот если точек может быть много — то SetPixel — быстрее, однозначно...

Насчет сравнения сокростей GDI и GDI+, то тут пока не проведешь замеры сказать ничего нельзя. В ряде случаев, к моему удивлению GDI+ делает GDI, причем там, где вроде бы должна притормаживать. Я конкретно для SetPixel/FillRectangle замеры не делал, но могу сказать, что если число точек не превышает сотен тысяч, то за производительность можно быть спокойным.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.