Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.11.2006, 07:25
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
По умолчанию Помогите, пожайлуста!

Задано изображение в .bmp формате, которое сохранено в фале.
Отобразить на экране это изображение путем случайного вибору точок из исходного файла
и перенести их на экран из задержкой каждого пикселя или группы пикселей.
Предусмотреть предохранение повторных переносов.
Ответить с цитированием
  #2  
Старый 18.11.2006, 11:59
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Примерно так:
Код:
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  
Старый 20.11.2006, 01:37
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
По умолчанию

Decoding, что то не работает!!! Хотя наверно у мя руки не оттуда выросли! Можеш подробнее написать что куда и как!!! Зараннен большая блогодарность!!! )))
Ответить с цитированием
  #4  
Старый 20.11.2006, 07:39
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

Вот пример - primer.zip
Ответить с цитированием
  #5  
Старый 20.11.2006, 18:54
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
Лампочка как сделать чтобы картинка быстрее открывалпсь??

как сделать чтобы картинка быстрее открывалпсь???
Ответить с цитированием
  #6  
Старый 20.11.2006, 19:58
Аватар для Decoding
Decoding Decoding вне форума
Местный
 
Регистрация: 03.06.2006
Адрес: Почту найдете на моем сайте
Сообщения: 576
Версия Delphi: D10.2
Репутация: 214
По умолчанию

1) УБЕРИ SLEEP
2) Доступ к пикселям через Canvas.Pixels очень медленный. Постарайся избавиться от этого (используй ScanLine). У меня получилось избавиться только от одного Canvas.Pixels - bm.Canvas.Pixels[p^.X,p^.Y].

Прежде, чем спросить, как это сделать, постарайся сам найти ответ.
Ответить с цитированием
  #7  
Старый 22.11.2006, 01:16
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
По умолчанию

Хорошо, большое спасибо!!! Тогда такой вопрос: можно ли выводить на канву не по одному пикселю, а группой(несколько пикселей)????? Если можна подскажите как?
Ответить с цитированием
  #8  
Старый 25.11.2006, 01:23
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
По умолчанию

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  
Старый 25.11.2006, 01:25
sandro sandro вне форума
Прохожий
 
Регистрация: 18.11.2006
Сообщения: 6
Репутация: 10
По умолчанию

Пожайлуста помогите, кто может что то знает, я то я не пойму что-то! Заранее спасибо!!! :-)))
Ответить с цитированием
  #10  
Старый 28.11.2006, 12:08
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
Стрелка

Господин 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;

__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter