![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрасить картинку определенным цветом
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;