Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрасить картинку определенным цветом


Страницы:   1 2

bogdan ©   (2005-08-16 12:59:00) 

Привет, не поможете решить задачку?
Нужно залить картинку выбраным цветом(черным например), но точки или линии должны рисоваться в случайном порядке.
Блин начитался документации по RGB и Tcolor, но не придумал как зделать так что бы не все в один миг зарисовалось а постепенно и по сути как зарисовать картинку когда точки появляются в разных местах.
как определить что нужно заливать а что нет(о пикселях)

Может подскажете что, Спасибо заранее.Только что-то попроще а то я потом буду надоедать наверное с вопросами


bogdan   (2005-08-23 07:56:00) [1]

большоt спасибо. Выручил


KilkennyCat   (2005-08-23 00:06:00) [2]

Отправил пример на почту.


bogdan   (2005-08-22 23:46:00) [3]

Привет снова.
Не хотел новую тему создавать.
Может расскажете как все-таки сделать так чтоб картинка плавно перешла в черный цвет. Тоесть будет как бы эффект сумерек.
Плиз!
Я работаю с каждым пикселем на canvas.Pixels и все страшно тормозит. и причем толком не знаю как бы лучше зделать.
По-этому спрашиваю у тех кто это должен точно знать.


bogdan   (2005-08-18 19:43:00) [4]

Народ спасибо, все получилось,большой Респект. только по 98 виндовс слегка тормозит но нормально...


MBo   (2005-08-18 08:19:00) [5]

Ты попробовал приведенный в [10] посте код?


bogdan   (2005-08-17 19:35:00) [6]

> ;)
>
> Да, есть такой алгоритм, и он и приведён.


Это здесь наверно?

Pts[Indx] := Pts[i - 1];

Но я когда пробовал так где то 1%не был залит только после 2 нажатия клавиши...


MBo   (2005-08-17 13:16:00) [7]

>может есть какой нить алгоритм чтоб выбраный елемент массива больше не использовался?

;)

Да, есть такой алгоритм, и он и приведён.


bogdan   (2005-08-17 12:58:00) [8]


> MBo ©   (16.08.05 17:26) [10]
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
>  Pts: array of TSmallPoint;
>  Len, i, w, ww, x, y, Indx: Integer;
> begin
>  DoubleBuffered := True;
>  w := Image1.Width;
>  Len := w * Image1.Height;
>  SetLength(Pts, Len);
>  for y := 0 to Image1.Height - 1 do begin
>    ww := y * w;
>    for x := 0 to w - 1 do
>      Pts[ww + x] := SmallPoint(x, y);
>  end;
>  Randomize;
>  for i := Len downto 1 do begin
>    Indx := Random(i);
>    Image1.Canvas.Pixels[Pts[Indx].X, Pts[Indx].Y] := clBlue;
>    Pts[Indx] := Pts[i - 1];
>    //Sleep(10);
>    Application.ProcessMessages;
>  end;
> end;

но ведь это не гарантирует полной закраски, может есть какой нить алгоритм чтоб выбраный елемент массива больше не использовался?


Думкин   (2005-08-17 08:36:00) [9]

> MBo ©   (17.08.05 08:33) [20]

Вот. Я помня это и поддел. :))))


MBo   (2005-08-17 08:33:00) [10]

>Не у всех результаты программы выводят на ЖК мониторы 3 метра на 2 метра. :)

А я недавно столкнулся ;)
Отлаживал программу с обработкой выводимой графики на своем 1024х768, удовлетворился 20-25% загрузкой процессора, а у заказчика все мониторы 20-21 дюйм ЖК с 1600х1200 - почти втрое больше пикселов, пришлось на месте переоптимизировать.


Думкин   (2005-08-17 08:05:00) [11]

> MBo ©   (17.08.05 07:53) [18]

Не у всех результаты программы выводят на ЖК мониторы 3 метра на 2 метра. :)
Принцип ясен.


MBo   (2005-08-17 07:53:00) [12]

>Думкин ©   (17.08.05 07:50) [16]
Ну тут-то требуется постепенное заполнение, скорость вывода большая, вероятно, не нужна, если не стоит задача 1600х1200 зарисовывать ;)


Думкин   (2005-08-17 07:51:00) [13]

А еще: Петцольд для 95 - читать.


Думкин   (2005-08-17 07:50:00) [14]

> MBo ©   (17.08.05 07:36) [15]

Ну тогда не надо и скромничать:

http://www.delphimaster.ru/articles/pixels/index.html

Там конечно, немного глубже - но горизонты увидеть можно.


MBo   (2005-08-17 07:36:00) [15]

>bogdan(snikers)   (16.08.05 23:14) [14]
Тип TSmallPoint описан в модуле Windows (точнее, Types) и используется здесь просто для экономии памяти в 2 раза (16-разрядные координаты вместо 32-х разрядных) - но это вовсе не обязательно.

DoubleBuffered  - для того, чтобы убрать моргание TImage

Application.ProcessMessages - из названия, думаю, очевидно. Здесь - для перерисовки на каждом шагу цикла и соответсвенно внесения некоторой задержки (можно обойтись Image1.Refresh, но тогда форма во время рисования не будет отвечать на действия
пользователя)

Но это все антураж, главное - разберись в принципе вывода каждой точки один раз.


bogdan(snikers)   (2005-08-16 23:14:00) [16]

а можно обьяснить ти TsmallPoint и откуда DoubleBuffered  и что делает Application.ProcessMessages;


Anatoly Podgoretsky   (2005-08-16 21:32:00) [17]

vrem   (16.08.05 19:46) [11]
Предлагаешь складывать или умножать :-)


KilkennyCat   (2005-08-16 20:37:00) [18]

Забавно, что при заполнении точками, создается ощущение, что они движутся по кругу. Хотя внешне системы не видно, гсч не так уж плох.


vrem   (2005-08-16 19:46:00) [19]

[5] bogdan   (16.08.05 13:59)
Линейно менять все значения r, g, b от 0 до сколько нужно по рисунку.


MBo   (2005-08-16 17:26:00) [20]


procedure TForm1.Button1Click(Sender: TObject);
var
 Pts: array of TSmallPoint;
 Len, i, w, ww, x, y, Indx: Integer;
begin
 DoubleBuffered := True;
 w := Image1.Width;
 Len := w * Image1.Height;
 SetLength(Pts, Len);
 for y := 0 to Image1.Height - 1 do begin
   ww := y * w;
   for x := 0 to w - 1 do
     Pts[ww + x] := SmallPoint(x, y);
 end;
 Randomize;
 for i := Len downto 1 do begin
   Indx := Random(i);
   Image1.Canvas.Pixels[Pts[Indx].X, Pts[Indx].Y] := clBlue;
   Pts[Indx] := Pts[i - 1];
   //Sleep(10);
   Application.ProcessMessages;
 end;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо