|
Вопрос # 2 254/ вопрос открыт / |
|
Здравствуйте!
Помогите, пожалуйста!
Нужно вывести массив в виде рисунка: значению элемента двумерного массива поставить в соответствие пиксель (или квадратик пикселей, если масштаб больше единицы, но является целым числом) определённого цвета.
Пользовался TImage, Canvas.Pixels, но постоянно нужно было выводить весь массив, поэтому скорость работы программы заметно упала...
Посоветуйте любой способ вывести массив в виде рисунка, главное чтоб был быстрым!
Заранее спасибо.
zainz
Приложение: Переключить в обычный режим-
-
-
- const
- maxnumplayers=4;
- mashtab=2;
-
- var
- Playercolor: array [0..maxnumplayers] of Tcolor;
-
- procedure setplayercolor;
- begin
- Playercolor[0]:=clwhite;
- Playercolor[1]:=clred;
- Playercolor[2]:=clgreen;
- Playercolor[3]:=clblue;
- Playercolor[4]:=clyellow;
- end;
-
-
- procedure viewcolony;
- var
- i,j,k,l:integer;
- begin
- with Fmain.Imain.Canvas do
- for i:=0 to Waorganizm-1 do
- for j:=0 to Haorganizm-1 do
- for k:=0 to mashtab-1 do
- for l:=0 to mashtab-1 do
- Pixels[i*mashtab+k,j*mashtab+l]:=Playercolor[Aorganizm[i,j].inalinable.player];
- end;
 |
Вопрос задал: 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 (статус: Посетитель), 3 января 2009, 21:40 [#1]:
Если у кого-нибудь есть ещё предложения по этой теме буду признателен. А пока разберусь с тем что уже есть.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|