Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с циклом, увеличть исполнение операции. 
:(
    Опции темы
Canyon
Дата 12.3.2012, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Что то не могу додуматься как увеличить скорость выполнения операции.

В коде я прохожу каждый пиксель и проверяю его на цвет, если не тот что надо меняю на нужный.
Из кода становиться понятно что он по очереди проходит высоту изображения.

Как сделать так что бы по одному запуску пошло выполнение сразу на всю высоту, тем самым увелив скорость выполнения операции.  smile 


Код

Var
 h, w : integer;
 C : TColor;
begin
 for h := 0 to BMP.Height Do
 for w := 0 to BMP.Width Do
 Begin
 C := BMP.Canvas.Pixels[w, h];
 if C <> clBlack Then
 BMP.Canvas.Pixels[w, h] := clWhite;
sleep(1);
 BitBlt(Form1.Canvas.Handle, 10, 10, BMP.Width, BMP.Height, BMP.Canvas.Handle,
 0, 0, SrcCopy);
 End;


upd. Добавил строчку sleep(1);
Проц перестало грузить но выполняться стало гораздо медленее

Это сообщение отредактировал(а) Canyon - 14.3.2012, 10:27
PM   Вверх
northener
Дата 12.3.2012, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Canyon @  12.3.2012,  00:57 Найти цитируемый пост)
В коде я прохожу каждый пиксель

Вот это очень сомнительно! Ибо никакой "высоты" (Height) в коде нет. Есть только "ширина" (Width).


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Canyon
Дата 12.3.2012, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



точно. Но Вот только не правильно и правильно оно работатет одинаково и как надо
PM   Вверх
Canyon
Дата 12.3.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Сегодня всячески пытался сделать эту задачу решаемой, но мозгов не хватило.
Подставил цикл while тогда он прочто проходит один раз высоту.
Что то не правильно я написал и понять не могу, ПОМОГИТЕ ХОТЬ ВЫ!
PM   Вверх
Illusion Dolphin
Дата 12.3.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Может стоит прорисовку из цикла вынести?

Код

Var
 h, w : integer;
 C : TColor;
begin
 for h := 0 to BMP.Height Do
 for w := 0 to BMP.Width Do
 Begin
 C := BMP.Canvas.Pixels[w, h];
 if C <> clBlack Then
 BMP.Canvas.Pixels[w, h] := clWhite;
 End;
 BitBlt(Form1.Canvas.Handle, 10, 10, BMP.Width, BMP.Height, BMP.Canvas.Handle,
 0, 0, SrcCopy);


Ещё поищи по TBitmap.Scanline - тоже будет быстрее чем Canvas.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Canyon
Дата 12.3.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Прорисовку я вставил что бы разобраться как работать будет. В дальнейшем я ее выкину конечно совсем.

Про ScanLine слышал и немного читал, но что то для меня пока это темный лес. МБ не то читал.

Мне не дает покоя эта задача. Уже и о циклах пошел заново читать, но что то не получаеться.
PM   Вверх
MetalFan
Дата 12.3.2012, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Canyon @  12.3.2012,  16:26 Найти цитируемый пост)
Уже и о циклах пошел заново

Лучше про scanline почитай. там все просто. Scanline[Index] (где Index от 0 до Height-1) - возвращает указатель на строку в битмапе. 
В каждой строке width элементов. Размер элемента зависит от битности изображения. Каждый элемент кодирует цвет соотв. пикселя.
При PixelFormat = pf24bit каждый пиксель может быть описан структурой TRGBTriple (PRGBTriple).
В общем направление указал - разбирайся)

з.ы. на закуску небольшой пример:
Код

var
  lTriple: PRGBTriple;
...
begin
...
  for i := 0 to pred( ABitmap.Height ) do
  begin
    lTriple := ABitmap.ScanLine[i];
    for j := 0 to pred( ABitmap.Width ) do
    begin
      if lTriple^.rgbtRed = 0 then 
         lTriple^.rgbtRed := 255;
      Inc(lTriple);
    end;
  end;



Это сообщение отредактировал(а) MetalFan - 12.3.2012, 23:02


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Canyon
Дата 14.3.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Со ScanLine сейчас разбераюсь, но в принципе скорость уже и на Pixels устраивает, колгда работает без прорисовки.
Уже интересно про сканлайн стало, так что придеться изучить.

А вот не ужели все таки нельзя запустить цикл так как я хотел? 
PM   Вверх
northener
Дата 14.3.2012, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(Canyon @  14.3.2012,  00:08 Найти цитируемый пост)
А вот не ужели все таки нельзя запустить цикл так как я хотел?  

А как хотел?
Так:
Код

 for h := 0 to BMP.Width Do
 for w := 0 to BMP.Width Do
?

P.S. неужели пишется слитно.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Leklerk
Дата 14.3.2012, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL ICQ   Вверх
Canyon
Дата 14.3.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Отредактировал первое сообщение. Не думал что на форуме через такое долгое время можно отредактировать сообщение.

Нет не так конечно хотел.

Хочу что бы замена пикселей пошла сразу на всю Height.

P.S. это опечатка. Ой извините. Только сейчас заметил что куча ошибок в русском тексте.
PM   Вверх
Leklerk
Дата 15.3.2012, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL ICQ   Вверх
MetalFan
Дата 15.3.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128




M
MetalFan
Модератор: Название темы должно отражать ее суть!
Дайте ВМЕНЯЕМОЕ название темы, соответствующее содержанию. При чем тут цикл, если вопрос в оптимизации работы с изображением?

И не отклоняемся от темы. Тут не школа с углубленным изучением русского языка.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Leklerk
Дата 15.3.2012, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 31.7.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(MetalFan @  15.3.2012,  17:49 Найти цитируемый пост)
Тут не школа с углубленным изучением русского языка. 

Недалеко же я смог углубиться!  smile 

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.