Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 254

/ вопрос открыт /

Здравствуйте!
Помогите, пожалуйста!
Нужно вывести массив в виде рисунка: значению элемента двумерного массива поставить в соответствие пиксель (или квадратик пикселей, если масштаб больше единицы, но является целым числом) определённого цвета.

Пользовался TImage, Canvas.Pixels, но постоянно нужно было выводить весь массив, поэтому скорость работы программы заметно упала...

Посоветуйте любой способ вывести массив в виде рисунка, главное чтоб был быстрым!

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

Приложение:
  1.  
  2.  
  3.  
  4. const
  5. maxnumplayers=4;
  6. mashtab=2;
  7.  
  8. var
  9. Playercolor: array [0..maxnumplayers] of Tcolor;
  10.  
  11. procedure setplayercolor;
  12. begin
  13. Playercolor[0]:=clwhite;
  14. Playercolor[1]:=clred;
  15. Playercolor[2]:=clgreen;
  16. Playercolor[3]:=clblue;
  17. Playercolor[4]:=clyellow;
  18. end;
  19.  
  20.  
  21. procedure viewcolony;
  22. var
  23. i,j,k,l:integer;
  24. begin
  25. with Fmain.Imain.Canvas do
  26. for i:=0 to Waorganizm-1 do
  27. for j:=0 to Haorganizm-1 do
  28. for k:=0 to mashtab-1 do
  29. for l:=0 to mashtab-1 do
  30. Pixels[i*mashtab+k,j*mashtab+l]:=Playercolor[Aorganizm[i,j].inalinable.player];
  31. end;


zainz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: zainz (статус: Посетитель)
Вопрос отправлен: 2 января 2009, 23:46
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, zainz!
Есть много способов. Но чем большую скорость они дают, тем сложнее с виду. Поэтому надо выбирать что то среднее.
Надо помнить, что использования свойства Pixels для TImage - самый медленный из существующих. И самое интересное, что делфи тут не виновата - просто функция, которая используется для установки/считывания пискеля делфи, изначально очень медленная - это проблемы Windows.
Но можно ускорить где то в 3-5 раз, если вместо TImage использовать TBitmap. Сильно переделывать код не нужно, но работать будет быстрее. Код где то такой

var bmp:TBitmap;
begin
  bmp:=TBitmap.create;
  bmp.width := 100;
  bmp.height := 100;
  bmp.pixelFormat := pf24bit;//могу немного ошибиться в написании
  bmp.canvas.pixel....
  .....
  bmp.free;
end;
Второй способ - использовать ScanLine. Этот способ дает очень быстный доступ к пикселям. Но для качественного кода прийдётся завести массив, где сформировать картинку, а потом перенести в TBitmap, откуда в TImage.
Рассказывать о всём долго, почитайте здесь и здесь, правда на английском. Но в целом гугл ещё никто не отменял.
Ну и последний, наиболее быстрый способ - сформировать bmp вручную. Это сложновато, но зато результат может превзойти все ожидания. Здесь на сайте я уже давал ссылки на описание файла и как это дело сформировать, ищите.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 3 января 2009, 19:20
Оценка за ответ: 5

Комментарий к оценке: Спасибо Вадим К! В целом понятно,
теперь знаю что использовать. Надо будет разобраться в этих способах, но ответ на свой вопрос я получил.
И за ссылки спасибо!

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 3 января 2009, 21:40; участников в обсуждении: 1.
zainz

zainz (статус: Посетитель), 3 января 2009, 21:40 [#1]:

Если у кого-нибудь есть ещё предложения по этой теме буду признателен. А пока разберусь с тем что уже есть.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.03 сек.