История одного проекта

История одного проекта
История одного проекта:
by Burger

Помните, раньше была такая штука, стереоскоп назывался. Ну так вот, данная штука могла делать из просто картинки стерео картинку(аля ОБЪЕМНУЮ КАРТИНКУ):)И я вдруг заинтересовался: "Каким же способом сделать такую штуку на наших боевых конях?". Прошел месяц. На руках программа и данный рассказ:)Ну слушайте и внимайте слову божью:)

"Зрительные пигменты глаза состоят из колбочек трёх типов, чувствительных к синему, зелёному и красному цвету."(с)Учебник биологии. Ну вот, на основе данного утверждения господа ученые разработали систему цветности для наших ПК. И получила название данная система RGB.В этой системе все цвета получаются путем смешивания синего, зеленого и красного цвета. Смесь синего и зеленого, например, даёт голубой цвет. Таким образом, все цвета можно засунуть в прямоугольную систему координат x,y,z. Где у всех координат максимальная цифра - 255.

Оси,такие как WIN или Linux, позваляют устанавливать разные цветовые режимы:

1.16-цветный режим.

2.256 цветный.

3.режим High Color, при котором для хранения цвета каждой точки выделяется 2 байта, что соответственно даёт 65000 цветов.

4.Режим True Color, предполагает выделение четыре байта под каждый цвет,ч то позволяет изменять доли составляющих красного, синего и зеленого в диапазоне от 0 до 255(RGB).

У данной системы есть всего два недостатка(ну у кого их нет:)).Намбер ван - зависимость от аппаратуры,намбер ту - невозможность получить ВСЕ цвета путем смешения синего, зеленого и красного. Теперь по поводу стерео. Стерео картинку можно имитировать (к сожалению именно имитировать) тремя способами:

1.Использовать стерео очки и специальную видео карту:)(NVIDIA вам поможет).

2.Купить специальный монитор(супер-пупер разработка буржуев,только у нас вы можете приобрести ЭТО всего за $6999).

3.Ну и собственно самый русский способ: смещение по красному цвету:) Потребуются красно-синие очки(ищи в инете, ну или 15 вечнодеревянных) и драйвер, сами знаете какой:)

Как это все сделать в Дельфи?-спросите вы. Проще,чем Дуську тискать!-отвечу я.

В Дельфи компонент TImage(картинки где хранишь) имеет свойство Canvas(или полотно). Полотно-это прямоугольная сетка,состоящая из маленьких квадратов, у которых кличка пиксели(Свойство Pixels[x,y]:TColor).Каждый пиксель содержит в себе координату на твоём экране и свой цвет. Левый верхний пиксель полотна считается нулевым. Общее количество пикселей по горизонтали определяется свойством - Width,а по вертикали - свойством Height. (всё выше и ниже сказанное можно отнести и к типу TBitmap). Таким образом, если:


var
 color:Tcolor;
 Image1:TImage;
begin
 //то на картинке пиксель с координатоми (100;100) окраситься в синий цвет.
 Image1.Canvas.Pixels[100,100]:=rgb(0,0,255);

 //теперь переменная color содержит цвет пикселя.
 color:=Image1.Canvas.Pixels[100,100];

 //теперь соседний пиксель тоже стал голубеньким:)
 Image1.Canvas.Pixels[100,101]:=color;
end;

Теперь рассмотрим данную конструкцию:


var
 x,y:integer;//обьявлем переменные типа integer(просто число).
 h,w:integer;
begin
 h:=500;//присваиваем значения.
 w:=500;
 for x := 1 to 500 do
  begin
   for y := 1 to 500 do
    begin
     //делаем что-нибудь.
    end;
  end;
end;

Таким образом мы пройдём квадрат 500x500.Это контрукция-основная по работе с цветом. В WinAPI есть такие функции как GetRvalue(),getBvalue(),getGvalue()-они возвращают номер оттенка(0-255) в виде integer в переменную.Например:


var
 i:integer;
begin
 //даст в переменную i оттенок синего в цвете clBlue.
 i:=getBvalue(clBlue); 
end;

Ну вот,зная это,уже можно реализовать прогу.Просто нужно весь красный цвет на "Левой" картинке соответсвенно переместить,сохраняя координаты,на "Правую" картинку.

Исходник можно взять тут: http://deadrabbit.by.ru/stereo_his.rar.Там всё подробно откоментировано,разберёшься:)Там же готовая прога : stereo3D_dez.rar. С базой все, перейдем к кодингу.(*Следующий раздел можно реализовать если вы решитесь публиковать исходные коды.)

Шкодинг - кодинг все дела:

Создай новый проэкт,сразу же сохрани его. Теперь лепи всё как показано на рисунке:

 

Logo

Итого:

1.Две панели(Panel) - закладка Standard.Свойство Caption меняй.

2.Два Image(лепяться поверх панели) - закладка Additional.Ничего менять не надо:)

3.Пять Button - закладка Standard,меняй Caption,как показано на рисунке. Кнопки распологать по возрастанию вниз.

4.два Label - закладка Standard,меняй Caption.

5.Два Edit - закладка та же,менять Text.

6.Два OpenPictureDialog и SavePictureDialog - закладка Dialogs.

У TForm1 поменяй свойство Caption и свойство WindowState в ws_Maximized (тогда прога будет грузиться в развёрнутом виде).

Теперь в Events создай у первой кнопки обработчик события на клик(кстати кнопка, для соответствия, называеться "Открыть Левую") и напиши туда следующий текст:


procedure TForm1.Button1Click(Sender: TObject);
begin
 if Openpicturedialog1.Execute then //Если Диалог активирован,то...
  begin
   //загружаем в Bitmap выбранную картинку.
   Bitmap.LoadFromFile(Openpicturedialog1.FileName); 
  end;
 Image1.Canvas.StretchDraw(rect(0,0,Image1.Width,Image1.Height),Bitmap);
 //отображаем Bitmap в Image1
end;

Теперь сделай то же самое с Буттоном2,где написано "Открыть правую", и напиши туда следующее:


procedure TForm1.Button2Click(Sender: TObject);
begin
 if Openpicturedialog2.Execute then //процедура индентична верхней.
  begin
   Bitmap2.LoadFromFile(Openpicturedialog2.FileName);
  end;
 Image2.Canvas.StretchDraw(rect(0,0,Image2.Width,Image2.Height),Bitmap2);
end;

Теперь тот же обработчик,но на кнопку намбер 3 ,где написано "Убрать красный":


procedure TForm1.Button3Click(Sender: TObject);
var //объявляем переменные.
 herR,herB,herG:integer; 
 color:TColor; //сюда будем сувать цвет.
 x,y:integer; //координаты картинки.
 h,w:integer; //высота,ширина картинки.
 count:integer; //переменная для ProgressBar
begin
 x:=0; //инициализация координат.
 y:=0;
 h:=Bitmap2.Height + 500; //высота кар. плюс + запас,известный глюк дельфи,нужно
 чтоб полностью прошла картинку.
 w:=Bitmap2.Width + 500;
 ProgressBar2.Max:=Bitmap.Height + 500; //максимальное значение ProgressBar.
 ProgressBar2.Min:=0; //минимальное.
 count:=0;
 for x := 1 to h do //цикл,подробнее в статье(выше).
  begin
   count:=count+1; //увеличиваем счётчик прогрессбара
   ProgressBar2.Position:=count;
   for y := 1 to w do
    begin
     //присваиваем цвет пикселя с координатами x,y.
     color:=Bitmap2.Canvas.Pixels[x,y]; 

     //разбиваем по частям,на синий,красный и зеленый.
     herR:=GetRvalue(color); 
     herB:=GetBvalue(color);
     herG:=GetGvalue(color);

     //убиваем красный,предыдущей картинки.
     Bitmap2.Canvas.Pixels[x,y]:=rgb(255,herG,herB); 
    end;
  end;
 Image2.Canvas.StretchDraw(rect(0,0,Image2.Width,Image2.Height),Bitmap2);
 //отображаем результаты.
end;

Ну держись ещё чуть-чуть и у тебя собственная уникальная прога! Теперь вешай обработчик на самую главную кнопку нашего проэкта или Button4(звать её "Сделать стерео"),и пиши:


procedure TForm1.Button4Click(Sender: TObject);
var //обявляем переменные.
 herR1,herB1,herG1:integer;//два разных типа под разные картинки.
 herR2,herB2,herG2:integer;
 color,color2:tcolor;//цвета тоже под разные.
 x,y:integer; //координаты первой картинки.
 x1,y1:integer; //координаты второй.
 h,w:integer; //ширина,высота.
 count:integer; //для ProgressBar
 g:integer; //сдвигив координатах.
 d:integer;
begin
 x:=0; //инициализация перемен
 y:=0;
 x1:=1;
 y1:=1;
 h:=Bitmap.Height + 500; //вышина,присваимое значение.
 w:=Bitmap.Width + 500;
 ProgressBar1.Max:=Bitmap.Height + 500;
 ProgressBar1.Min:=0;
 count:=0;

 // сдвиг,определение в зависимости от введенного пользователя.
 g:=StrToInt(Edit1.Text); 
 d:=StrToInt(Edit2.Text);
 for x := 1 to h do //цикл
  begin
   x1:=x; //вторая координата, но уже со сдвигом.
   x1:=x1+g;
   count:=count+1;
   ProgressBar1.Position:=count;

   for y := 1 to w do
    begin
     y1:=y; // то же что и с x.
     y1:=y1+d;

     //присваиваем и разбиваем цвет по переменным.
     color:=Bitmap.Canvas.Pixels[x,y]; 
     herR1:=GetRvalue(color);
     herB1:=GetBvalue(color);
     herG1:=GetGvalue(color);

     //обрабатываем, оставляем один красный на "левой"
     Bitmap.Canvas.Pixels[x,y]:=rgb(herR1,0,0); 

     color2:=Bitmap2.Canvas.Pixels[x1,y1]; //разбиваем цвет.
     herR2:=GetRvalue(color2);
     herB2:=GetBvalue(color2);
     herG2:=GetGvalue(color2);

     //присваиваем красный "Левой" картинке "Правой",соблюдая пропорции:)
     Bitmap2.Canvas.Pixels[x1,y1]:=rgb(herR1,herG2,herB2); 
    end;
  end;
 Image1.Canvas.StretchDraw(rect(0,0,Image1.Width,Image1.Height),Bitmap);
 //отображаем всё получившееся.
 Image2.Canvas.StretchDraw(rect(0,0,Image2.Width,Image2.Height),Bitmap2);
end;

Ну всё уже практически финишь:)Последняя кнопка номер 5,тот же обработчик на клик и текст:


procedure TForm1.Button5Click(Sender: TObject);
begin
 if Savepicturedialog2.Execute then //cохраняем в ИСХОДНЫХ размерах.
  begin
   Bitmap2.SaveToFile(Savepicturedialog2.FileName);
  end;
end;

Чуть не забыл,У Form1 в Events сделай обработчик события на OnCreate и пиши ниже следующие:


procedure tform1.FormCreate(Sender: TObject);
begin
 Bitmap:=TBitmap.Create; //Подготавливаем Битмапы для работы;
 Bitmap2:=TBitmap.Create;
end;

Фух,ну как довлен?Надеюсь да,для тебя старался:)И на сладкое обзор прог конкурентов, делающих тоже самое:

3D Stereo Image Factory(http://members.aol.com/threedr) - продукт от SoFTreat(не обновлялась уже с 1999:)),объемом 5 мегов,демка:)зарегить стоит 99$:)При незарегистрированном юзанье нельзя сохранить получившуюся фотку,и в режиме полноэкранного просмотра на верху светится надпись DEMO.

3D Combine(www.photoalb.com/combine) - эта тоже демка,но подешевле всего 34$.У демки фукциональных ограничений нет,но можно запустить всего 30 раз.Умеет работать с видео. размер - 6,4 метра.

Z-Anaglyph(http://z-graphix.com) - ИМХО лучшая прога из обзора.Во-первых,она бесплатная:), во-вторых, в интерфейсе проги всего три кнопки:)Но у неё есть и недостаток:)она на французком:)Размер - 1,1 МБ.

http://www.stereomir.ru - сайт российской компании,занимающейся стереофотографией, тут можно взять халявные очки(одни на чела),купить их,высылают очки по почте.(бумажные очки стоят - 15руб).Офис находится в Москве.

Список отъюзанной литературы:

Delphi 5 : руководство разработчика(Sums,841 стр.)

Delphi 5 : создание мультимедийных приложений,програмирование графики.(Н.Тюкачев,Ю.Свиридов,2001 Питер.400 стр.)

 Исходники примера забирай здесь



Опубликовал admin
9 Май, Пятница 2003г.



Программирование для чайников.