Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.027 c
6-1117982066
focor
2005-06-05 18:34
2005.10.02
Быстрее webbrowser


14-1126079926
Антоний
2005-09-07 11:58
2005.10.02
Файл *.12M


14-1126640182
Piter
2005-09-13 23:36
2005.10.02
Подскажите про собаку...


3-1124475271
Michael5
2005-08-19 22:14
2005.10.02
Можно ли получить инфу о ходе выполнения запроса к БД?


1-1126079154
psa247
2005-09-07 11:45
2005.10.02
DoubleClick по RichEdit




   Наверх