Текущий архив: 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