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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая графика 
:(
    Опции темы
Illusion Dolphin
  Дата 8.5.2004, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Нужно быстро перевести одну картинку в другую, т.е. сделать плавный переход. Если использовать scanline, то получается всё же не настолько быстро, насколько хотелось бы, и если брать 2 картинки 600х800, 24 бита, то очень сильно тратятся системные ресурсы и всё притормащивает... Насколько я понимаю, то это можно сделать при помощи DirectX, но я не знаю, как обращаться с этим "объектом"... Можете дать небольшой примерчик как преобразовывать и выводить с помощью его графику?


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


Эксперт
***


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

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



Illusion Dolphin, через scanline тоже можно сделать быстро. просто делай не для каждого пиксела подряд, а со случайным шагом, т.е. чтобы за один проход у тебя менялось, скажем, 10 % случайно выбранных пикселей, а последним, десятым, шагом просто тупо присваивай одну картинку другой.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Illusion Dolphin
  Дата 9.5.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



x77:

Цитата
10 % случайно выбранных пикселей


Это не гарантирует, что через 10 шагов вся картинка перейдёт в другую... Получится очень хорошо видимый шум, чтобы избавляться придётся как минимум создавать ещё одну карту, в которой придётся поменчать "использованые" пикселы, но тогда работа межет быть ещё медленнее, чем простым перебором sad.gif... И кроме того хочется научиться работы с directX, чтобы не только это уметь делать, а ещё и многое другое...

Это сообщение отредактировал(а) Illusion Dolphin - 9.5.2004, 16:06


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


Опытный
**


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

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



Illusion Dolphin

посмотри, может подойдет
http://www.delphimaster.ru/articles/pixels/index.html
PM MAIL WWW ICQ   Вверх
dm9
Дата 9.5.2004, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



1. scanline
2. Алгоритм перевода картинки - такой.
R0 - нач. значение красной составляющей цвета.
R1 - кон. значение красной составляющей цвета.
for i := 0 to 9 do
begin
R := R0 + (R1-R0)*Sin(360/10*i*Pi/180);
G := G0 + (G1-G0)*Sin(360/10*i*Pi/180);
B := B0 + (B1-B0)*Sin(360/10*i*Pi/180);
end;
Либо так - по синусу.
Либо линейно (ну, сам разберёшься).
PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 9.5.2004, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dm9, Большое спасибо за разнообразные способы работы со scanline...
DriveSoftware, тоже спасибо, это аналог...

Но! Со scanline я работать умею хорошо, вся проблема с тем, что всё-таки это занимает достаточно много системных ресурсов, даже если использовать простые линейные алгоритмы, не говоря уже о синусах (для этого случая я даже строил массивы значений синуса - намного быстрее получается smile.gif)...
И, видя как быстро всё продумывает компьютер в 3-D играх, сразу волей-неволей хочется научится пользоваться именно DirectX, т.к. он использует ещё и аппаратные возможности (если не ошибаюсь), в связи с чем хочется работать не со scanline, а с DirectX... Есть у кого-нибудь пример? Перевод одного изображения в другое - это как минимальный пример, который бы хотелось увидеть...


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


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Да, задачка не так проста оказалась smile.gif
Вот маскимум что я и ещё один человек смогли совместно сделать.
На Атлоне 2200 работает зашибись, а на Селероне 433 подтормаживает... заметны переходы.
Кто сделает быстрее?
Хотелось бы посмотреть...

Код
program bmp1;

uses
   Windows, Graphics;

const
   NN     = 50;    //Число кадров от одной до другой картинки
   NNN    = 32768; //Кратно двойке!!!
   Width  = 800;
   Height = 600;

type
   TLine = array [0..$7FFFFFFE] of Byte;
   PLine = ^TLine;
var
   B, B1, B2 : TBitMap;
   i, j, k   : Integer;
   L, L1, L2 : PLine;
   S         : Dword;
   R         : Real;
   F         : Integer;
   C         : TCanvas;
begin
   C := TCanvas.Create;
   C.Handle := GetDC (0);
   B  := TBitMap.Create;
   B1 := TBitMap.Create;
   B2 := TBitMap.Create;
   B.LoadFromFile  ('1.bmp');
   B1.LoadFromFile ('1.bmp');
   B2.LoadFromFile ('2.bmp');
   B.PixelFormat  := pf24bit;
   B1.PixelFormat := pf24bit;
   B2.PixelFormat := pf24bit;
   for S := 0 to NN*2 do
   begin
      R := (Sin (Pi*S/NN) + 1) / 2;
      F := Trunc (NNN * R);
      for i := 0 to Height-1 do
      begin
         L  := B.ScanLine [i];
         L1 := B1.ScanLine [i];
         L2 := B2.ScanLine [i];
         for j := 0 to Width-1 do
         begin
            k := j*3+1;
            L[k  ] := L1[k  ] + (L2[k  ] - L1[k  ]) * F div NNN; //Здесь компилятор оптимизирует это до shr 15
            L[k+1] := L1[k+1] + (L2[k+1] - L1[k+1]) * F div NNN;
            L[k+2] := L1[k+2] + (L2[k+2] - L1[k+2]) * F div NNN;
         end;
      end;
      C.Draw (0, 0, B);
   end;
   B.Free;
   B1.Free;
   B2.Free;
   C.Free;
end.


PS Синус ни при чём. Линейно делал - работает так же.

Это сообщение отредактировал(а) dm9 - 9.5.2004, 21:34
PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 9.5.2004, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dm9, у меня код очень сильно в первом приближении напоминает твой, даже слишком... Я выводил 25 кадров в секунду (640х480) с такой помошью, переводя один в другой плавно и при этом добавляя специально шум, девиацию яркости и другие прелести (код привести могу, но он немного великоват и трудет для чтения)... Получается даже очень хорошо, но на быстрых машинах, но посмотришь на кваку - выводит и рассчитывает такое, что диву даёшься... Тут есть две основные загвоздки: Tcanvas.Draw - работает не настолько быстро, как хотелось бы... DirectX вроде пишет сразу в видеокарточку обходя многие излишества... Второе - вычисление пикселей нового битмапа - "L[k ] := L1[k ] + (L2[k ] - L1[k ]) * F div NNN;" (пусть даже shr 15) - лучше всё это переложить на видеокарточку, хоть это... Так что вопрос всё равно открыт, пусть даже в виде
Цитата
Кто сделает быстрее?
Хотелось бы посмотреть...




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


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Думаю, что основная проблема не в выводе Canvas.Draw, а всё-таки именно в вычислениях, так как при увеличении частоты процессора всё ОК... а вот как их ускорить - хз.
Добавлено @ 21:44
Хотя этот ещё вопрос... может, и вывод тормозит.
PM MAIL ICQ   Вверх
Akella
Дата 13.5.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



To Illusion Dolphin:
Отсылаю небольшие статейки по DirectX & OpenGL, может что интересное найдешь.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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