Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> быстрая графика 
:(
    Опции темы
_beginner_
Дата 3.2.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.2.2007
Где: Россия

Репутация: нет
Всего: нет



объясните, как быстро выводить графику с    ScanLine[] и PByteArray.
Как к примеру вывести пиксел красного цвета в левом верхнем углу формы или нарисовать линию?


PM   Вверх
s-mike
Дата 3.2.2007, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Цитата(_beginner_ @  3.2.2007,  19:13 Найти цитируемый пост)
Как к примеру вывести пиксел красного цвета в левом верхнем углу формы или нарисовать линию?

Для формы ScanLine не даст никакого ускорения, поскольку этим методом можно рисовать только на битмапе. То есть придется создавать временный битмап, выводить на нем изображение с помощью ScanLine и уже потом выводить на форму. Это не даст никакого прироста производительности.

А для вывода линий ScanLine вообще использовать противопоказано, поскольку оптимальный алгоритм и так уже реализован в функции LineTo.
PM MAIL WWW   Вверх
_beginner_
Дата 3.2.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 3.2.2007
Где: Россия

Репутация: нет
Всего: нет



просто я один примерчик нашёл с быстром выводом графики:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
  t: cardinal;
  x, y: integer;
  bm: TBitmap;
  p: PByteArray;
begin
  bm := TBitmap.Create;
  bm.PixelFormat := pf24bit;
  bm.Width := Form1.ClientWidth;
  bm.Height := Form1.ClientHeight;
  t := GetTickCount;
  for y := 0 to bm.Height - 1 do
  begin
    p := bm.ScanLine[y];
    for x := 0 to bm.Width - 1 do
    begin
      p^[x*3] := x+y;
      p^[x*3+1] := x-y;
      p^[x*3+2] := y-x;
    end;
  end;
  Form1.Caption := IntToStr(GetTickCount - t);
  Form1.Canvas.Draw(0, 0, bm);
end;


мне вот непонятно как он работает? Можно ли так быстро по одному пикселу выводить или нет?

M
Alexeis
Модератор: используйте подсветку кода http://forum.vingrad.ru/index.php?showtopic=126445


Это сообщение отредактировал(а) Alexeis - 4.2.2007, 15:40
PM   Вверх
s-mike
Дата 4.2.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Цитата(_beginner_ @  3.2.2007,  22:29 Найти цитируемый пост)
Можно ли так быстро по одному пикселу выводить или нет?

Можно, выводит ведь smile

Почему ScanLine быстрее Pixels? ScanLine модифицирует данные напрямую в памяти, без вызова функций Windows API (SetPixel) и вызова protected-метода TBitmap под названием Changed, который приводит к перерисовку битмапа, если он к тому же присвоен какому-то компоненту вроде TImage. Но это не значит, что ScanLine позволит более быстро выводить линии/окружности и т.п. Функции GDI как правило работают напрямую с устройством вывода (если это вывод на экран - то с видеокартой) и не рассчитывают координаты той же окружности математически, все это делает видеокарта.
PM MAIL WWW   Вверх
CatATonik
Дата 5.2.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: нет
Всего: 8



2s-mike: 
Вообще-то иногда вывод в Bitmap с последующей его прорисовкой это лучший вариант, если надо нарисовать сложное изображение, т.к. при выводе непосредственно, изображение может "мерцать", при прорисовке в Bitmap этого не происходит. Так-же это может быть полезно при выводе чего-то не стандартного, для чего нет APIшной функции, например градиент какой-нибудь и т.д.

2beginner:
Функция ScanLine[Y] возвращает ссылку на массив цветов точек из строки Y. Формат этого массива зависит от формата Bitmap. В приведенном тобой примере (bm.PixelFormat := pf24bit;) на каждую точку приходится три байта (R, G, B по одному байту на цвет), соответственно:
      p^[x*3] := x+y;     // Устанавливается яркость синего цвета для точки X, Y
      p^[x*3+1] := x-y;  // Зеленый
      p^[x*3+2] := y-x;  // Красный


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.