![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Задано изображение в .bmp формате, которое сохранено в фале.
Отобразить на экране это изображение путем случайного вибору точок из исходного файла и перенести их на экран из задержкой каждого пикселя или группы пикселей. Предусмотреть предохранение повторных переносов. |
|
#2
|
||||
|
||||
|
Примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
bm: TBitmap;
p: PPoint;
l: TList;
i, j: integer;
begin
bm := TBitmap.Create;
bm.LoadFromFile( 'c:\windows\пузыри.bmp' );
l := TList.Create;
for i := 0 to bm.Width do
for j := 0 to bm.Height do
begin
New( p );
p^.X := i;
p^.Y := j;
l.Add( p );
end;
Randomize;
while l.Count > 0 do
begin
i := Random( l.Count );
p := l[i];
Form1.Canvas.Pixels[p^.X,p^.Y] := bm.Canvas.Pixels[p^.X,p^.Y];
l.Delete( i );
Application.ProcessMessages;
Sleep( 1 );
Caption := IntToStr( l.Count );
end;
l.Free;
bm.FreeImage;
end; |
|
#3
|
|||
|
|||
|
Decoding, что то не работает!!! Хотя наверно у мя руки не оттуда выросли! Можеш подробнее написать что куда и как!!! Зараннен большая блогодарность!!!
))) |
|
#4
|
||||
|
||||
|
Вот пример - primer.zip
|
|
#5
|
|||
|
|||
|
как сделать чтобы картинка быстрее открывалпсь???
|
|
#6
|
||||
|
||||
|
1) УБЕРИ SLEEP
2) Доступ к пикселям через Canvas.Pixels очень медленный. Постарайся избавиться от этого (используй ScanLine). У меня получилось избавиться только от одного Canvas.Pixels - bm.Canvas.Pixels[p^.X,p^.Y]. Прежде, чем спросить, как это сделать, постарайся сам найти ответ. |
|
#7
|
|||
|
|||
|
Хорошо, большое спасибо!!! Тогда такой вопрос: можно ли выводить на канву не по одному пикселю, а группой(несколько пикселей)????? Если можна подскажите как?
|
|
#8
|
|||
|
|||
|
Decoding, и еще маленькая просьба Вы не моглиб рассказать общий принцып работы этой программы :
procedure ShowPicture( path: string ); var bm: TBitmap; // это присваиваем тип p: PPoint; //что это? l: TList ;//что это? i, j: integer; begin bm := TBitmap.Create; bm.LoadFromFile( path ); l := TList.Create; //что это? for i := 0 to bm.Width do //что это? for j := 0 to bm.Height do //что это? begin New( p ); p^.X := i; //что означают эти p^.X "^" p^.Y := j; l.Add( p );//что это? end; Randomize; while l.Count > 0 do begin i := Random( l.Count ); p := l[i]; Form1.Canvas.Pixels[p^.X,p^.Y] := bm.Canvas.Pixels[p^.X,p^.Y];//что это? l.Delete( i );//что это? Application.ProcessMessages; //что это? Form1.Caption := IntToStr( l.Count );//что это? end; l.Free; bm.FreeImage; //освобождение памяти! end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then ShowPicture( OpenDialog1.FileName ); end; |
|
#9
|
|||
|
|||
|
Пожайлуста помогите, кто может что то знает, я то я не пойму что-то! Заранее спасибо!!! :-)))
|
|
#10
|
||||
|
||||
|
Господин Sandro, большая просьба, прежде, чем задавать вопросы, внимательно ознакомьтесь хотябы с помощью Delphi.
Код:
procedure ShowPicture( path: string );
var
bm: TBitmap; // это присваиваем тип
p: PPoint; //присваиваем тип =) PPoint-Pointner на Point,ссылка на точку
l: TList ;//присваиваем переменной l тип TList (список)
i, j: integer;
begin
bm := TBitmap.Create;
bm.LoadFromFile( path );
l := TList.Create; //это то же, что и TBitmap.Create; - создание экземпляра класса TList
//это задание цикла for .. to .. do
//в нашем случае, это значит, что действия,
//стоящие после do будут повторятся от bm.Width раз
//т.е. столко раз, сколько пикселей в ширину картинка в bm
//причем с каждым новымциклом,переменная i будет принимать
//значение на одно больше, чем предыдущее, и в итоге, за весь
//цикл,переменная i примет значенияот 0 до bm.Width включительно
//далее следует вложенный цикл, который повторяется bm.Height раз
//то есть за один проход верхнего цикла будет выполняться
//полностью весь нижний.
//это позволит перебрать все пиксели в изображении:
//наш воображаемый курсор перебора пикселей будет двигаться так:
//сначала пройдет сверху вниз по нулевому столбцу,затем передвинется
//на один столбец правее и снова пройдет егосверху донизу и т.д.
for i := 0 to bm.Width do
for j := 0 to bm.Height do
begin
New( p );
p^.X := i; //что означает символ ^ читай в хэлпе, понятней будет,а вообще - это указатель
p^.Y := j;
l.Add( p );//это добавление в спиок l элемента p
end;
Randomize;
while l.Count > 0 do
begin
i := Random( l.Count );
p := l[i];
//это прямое копирование пикселей
//канваса(читай про него в хэлпе) изображения в канвас формы
Form1.Canvas.Pixels[p^.X,p^.Y] := bm.Canvas.Pixels[p^.X,p^.Y];
l.Delete( i );//удаление из списка l элемента номер i (про i писал выше)
//про это читай в хэлпе и вообще не
//рекоменую этим пользоваться,глючная штука
//в двух словах - это, чтобы твоя прога не
//подвисала во время длительных операций
Application.ProcessMessages;
Form1.Caption := IntToStr( l.Count );//текст в заголовке формы = количеству элементов в списке l
end;
l.Free;
bm.FreeImage; //освобождение памяти!
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
ShowPicture( OpenDialog1.FileName );
end;
|