|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Графика... много точек
Возьмем пример: приложение в котором канва формы заполняется черным цветом этим циклом :
Код:
For x := 0 to Form.Width do For y := 0 to FormHeight do Form.Canvas.Pixels[x, y] := clBlack; Код:
Form.Canvas.Rectangle(0,0,Form.Width, Form.Height) Как он делает это быстрее? Как (можно такое вобще?) добиться того, что б первое делалось хотя б приблизительно как второе? Я ни в чем никогда не уверен... И в этом тоже... |
#2
|
|||
|
|||
не знаю как ты проверял но второй вариант у меня быстрее намного выполняется.
|
#3
|
|||
|
|||
Второе быстрее, т.к. нет постоянного "разрешения" точек. Еще быстрее должен быть FillRect, но, боюсь, эту разницу отследить будет тяжело.
На второй вопрос ответ простой - ScanLine. Эта процка как раз дает тебе возможность работать с памятью напрямую. При ее использовании скорость станет сравнима, а не в разы медленнее. |
#4
|
|||
|
|||
А можно поподробнее про ScanLine... Это WinApi? Как она работает? И как ее использовать?
Я ни в чем никогда не уверен... И в этом тоже... |
#5
|
|||
|
|||
Help! Help! Help!
Народ помогите!!!!!
Я немноо не понимаю этот сканлайн... Так что поставлю вопрос подругому... Выложите сюда плиз процедуру рисования точки в одну строку.... тоесть : Код:
ScanLine[87,67] := Rgb(56,96,250); Код:
procedure StavTochka(x,y : Integer; r, g, b : byte); begin scanline... // тут собственно скан лайн end; ... {use} For i := 9 to 54 do StavTochka... Я ни в чем никогда не уверен... И в этом тоже... |
#6
|
|||
|
|||
Help! Help! Help!
И большая просьба не кидайте тему... Я знаю что здесь есть люди которые могут сделать то, что я прошу... А ведь оно не токо мне одному надо!
Я ни в чем никогда не уверен... И в этом тоже... Последний раз редактировалось Interface, 11.12.2008 в 13:02. |
#7
|
|||
|
|||
Э... может так...
Я тут про СканЛайн почитал и кажется понял суть его работы...
По видимому он дает изображение как массив пикселей... Так может быть можно так: 1. Один раз "отсканировать" изображение Pixels'om (что должно быть долго =() ; 2. Получить массив пикселей... его же хранить вместо TImage; 3. А из полученного массива строить БитМап как это в Faq'e написано(http://www.delphisources.ru/pages/fa..._to_bmp.html); 4. Его и выводить. Вопрос : Будет ли приведенный мной метод работать как скан лайн? И имеет ли это смысл? Я ни в чем никогда не уверен... И в этом тоже... Последний раз редактировалось Interface, 27.12.2008 в 11:38. |
#8
|
||||
|
||||
ScanLine по сути своей есть указатель (PByteArray) на ту область памяти где храниться изображение. Один пискел изображения может быть представлен как одним (256 цветов) так и несколькими байтами этой области. Для того чтобы понять сколько байт кодируют один пиксел изображение нужно прочитать свойство PixelFormat.
Ну и далее просто пишем код Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
|||
|
|||
а все таки...
По идеи скан лайн все таки сканирует битмап и дает пользователю массив с цветами...
А то что я пишу будет в основном рисовать (ну тоесть ему и не надо знать что на рисунке нарисованно) и поэтому вобщем то скан лайн мне здесь получается не нужен... Зато черезвычайно важно знать как быстрее всего вывести точку на экран! И вообще что сложнее(дольше будет выполняться)? Код:
I := sqrt(sqr(a)+sqr(b))*div 3// то есть вообще без вывода графики Код:
Form1.Canvas.Pixels[5,8] := Rgb(45,45,45); Я ни в чем никогда не уверен... И в этом тоже... |
#10
|
||||
|
||||
есть замечательные функции SetBitmapBits() и GetBitmapBits()
_____________ долго ломал голову что это за формула: I := sqrt(sqr(a)+sqr(b))*div 3 Вообще доступ к любой ячейке массива это ширина_массива*номер_строки*размер_ячейки + номер столбца*размер_ячейки ...сказал, и загрустил от бесспорной своей правоты Последний раз редактировалось 0nni, 27.12.2008 в 13:05. |
#11
|
|||
|
|||
Цитата:
На самом деле я просто привел два случайных действия и хочу узнать что комп будет быстрее делать считать или выводить на экран точку? А дайте пример с SetBitmapBits() и GetBitmapBits() тобишь исходник проги (Работующей проги!)которая будет рисовать квадрат с помощью этих функций... Я ни в чем никогда не уверен... И в этом тоже... |