Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

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

 
bogdan   (2005-08-16 12:59) [0]

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

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


 
rts111 ©   (2005-08-16 13:31) [1]

for i:=0 to 10000 do
mypic.canvas.pixse[random(mypic.width),random(mypic.hight)]:=myColor;


 
KilkennyCat ©   (2005-08-16 13:35) [2]


>  [1] rts111 ©   (16.08.05 13:31)
> for i:=0 to 10000 do
> mypic.canvas.pixse[random(mypic.width),random(mypic.hight)]:=myColor;


чушь. никакой гарантии полной закраски.

Смотри информацию о методах заполнения массивов разными числами.


 
rts111 ©   (2005-08-16 13:51) [3]

Первое что пришло на ум.
Для полной закраски увеличивай 10000 до бесконечности.


 
Anatoly Podgoretsky ©   (2005-08-16 13:58) [4]

TCanvas.FillRect


 
bogdan   (2005-08-16 13:59) [5]

И еще один вопрос! КАК СДЕЛАТЬ ЭФЕКТ РАССВЕТА, ТОЕСТЬ ЕСТЬ У МЕНЯ КАРТИНКА, И КАК С ЧЕРНОГО ЦВЕТА ПЕРЕЙТИ НА КАРТИНКУ, НУ ТИПА СОЛЦЕ ВСХОДИТ И ВСЕ ВИДНО СТАНОВИТЬСЯ

Спасибо буду искать как говорите....


 
KilkennyCat ©   (2005-08-16 14:05) [6]


> [3] rts111 ©   (16.08.05 13:51)
> Первое что пришло на ум.
> Для полной закраски увеличивай 10000 до бесконечности.


Да, но подумайте, сколько будет совпадений в конце, и как долго визуально придется ждать закраски последней точки.


> КАК СДЕЛАТЬ ЭФЕКТ РАССВЕТА


менять яркость этой картинки, что с рассветом.


 
Anatoly Podgoretsky ©   (2005-08-16 14:10) [7]

Теперь придется разбираться что такое яркость для RGB


 
snikers ©   (2005-08-16 16:02) [8]


> Anatoly Podgoretsky ©   (16.08.05 14:10) [7]
> Теперь придется разбираться что такое яркость для RGB

Хорошо подметили...
Но даже если и менять яркость(еще не знаю что такое ) так менять по пикселях или по строчкам?
Кстати пробовал random/ Долго пришлось ждать.
Я старался найти в нете примеры на делфи вот этих самых "эфектов" ведь видел как на интеренет страницах такое есть, но ничего не нарыл подобное.
Если будет время так напишите хотя бы FAQ какой о этих Rgb pByteArray и т.п. Блин замучило.


 
bogdan(snikers)   (2005-08-16 16:03) [9]

СПАСИБО за помощь.
Просто  з графикой я вааще никогда не работал, а тут вот пришлось тут как тут


 
MBo ©   (2005-08-16 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;



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

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


 
KilkennyCat ©   (2005-08-16 20:37) [12]

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


 
Anatoly Podgoretsky ©   (2005-08-16 21:32) [13]

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


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

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


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

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

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

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

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


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

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

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

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

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


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

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


 
MBo ©   (2005-08-17 07:53) [18]

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


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

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

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


 
MBo ©   (2005-08-17 08:33) [20]

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

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


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

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

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


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


> 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;

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


 
MBo ©   (2005-08-17 13:16) [23]

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

;)

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


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

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


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

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

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


 
MBo ©   (2005-08-18 08:19) [25]

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


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

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


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.063 c
2-1124753373
Quadra
2005-08-23 03:29
2005.10.02
"Зависающее" приложение


1-1126181305
JTAG
2005-09-08 16:08
2005.10.02
Как можно узнать открыт файл или нет?


6-1118389287
Dimitrij
2005-06-10 11:41
2005.10.02
Проблема с NMFTP.List;


1-1126671066
Denizzz
2005-09-14 08:11
2005.10.02
Как получить серийный номер жесткого диска?


2-1124703827
CrowD
2005-08-22 13:43
2005.10.02
Ссылки