Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2012-02-16 09:47:30 ЛС | профиль | цитата
login, я же
Tad писал(а):
Главное - определиться с точкой отсчета.

ejfo.png
пальчиком покажи где
login писал(а):
V=1 то есть = 255
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1ejfo.png [43.7KB] [332]
Ответов: 1429
Рейтинг: 50
#17: 2012-02-16 09:57:03 ЛС | профиль | цитата
Пардон, ошибся, как раз Вы меня опередили. Я сделал скриншоты, это = 0,50. (но, тоже, не 76)

ЧБ - выглядит так:
1sdfhh.png

V из HSV выгядит так:
2aerh.png
карма: 0

0
файлы: 21sdfhh.png [75.7KB] [452], 2aerh.png [88.1KB] [345]
Ответов: 16884
Рейтинг: 1239
#18: 2012-02-16 10:45:31 ЛС | профиль | цитата
1.
login писал(а):
А то, что столбик "яркость" у винды цветной, так это они просто его для красоты раскрасили. Подругому просто не придумали как его изобразить.
Нет, милый. При нулевой яркости любой цвет превращается в черный. Ночью все черное. А если включить очень яркий свет, то тоже цветов не различишь. Так что столбик яркости они раскрасили правильно.
2.
ashkalov писал(а):
как узнать оттенок контраст яркость цвета полученного Img_getPoint ?
Img_getPoint выдает цвет точки, который создается тремя точками люминофора (RGB)
3. И как не крутись, а формула яркости точки из трех RGB пикселей, учитывая цветочувствительность глаза, Y=0.3R+0.59G+0.11B, а для современных мониторов Y=0.21R+0.72G+0.07B.


карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1429
Рейтинг: 50
#19: 2012-02-16 10:54:07 ЛС | профиль | цитата
Login писал(а):
А то, что столбик "яркость" у винды цветной
- яркость и цвет в пространстве HSV - разделены, и идут на разных каналах. Поэтому этот столбик должен быть чернобелым. Но для удобства сделали цветной.

Вот, пример, проф-софта где этот столбик черно-белый:
stolbik.png

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

Только я чет не понял, что за цв-пространство у винды на стандартной палитре выбора цвета, кроме RGB? Какое-то калечное HSV , с неправильным V

Проверил по HSL этот красный цвет - L равен 0,50. Получается, что у винды HSL.
[offtop]
L - светлота цвета с точки зрения восприятия человека, в условиях, когда в яркий солнечный день на цветной лист бумаги светит солнце, и отражая этот свет цвет не меняясь по фазе и насыщенности становится светлее. "Выбеливается".[/offtop]
карма: 0

0
файлы: 1stolbik.png [51.5KB] [380]
Ответов: 16884
Рейтинг: 1239
#20: 2012-02-16 20:54:42 ЛС | профиль | цитата
login, как только сделаешь то же со своими данными, так и соглашусь
project12color.rar

------------ Дoбавленo в 20.54:
login писал(а):
когда в яркий солнечный день на цветной лист бумаги светит солнце
разговор идет про цвет проходящий (дисплей), а не отраженный. Это разные вещи.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1project12color.rar [407.4KB] [99]
Ответов: 1429
Рейтинг: 50
#21: 2012-02-17 04:58:23 ЛС | профиль | цитата
Я понял, вы выполняете не только получение яркости пикселя, но еще и преобразование изображения для просмотра на мониторе А я, из задачи понял, что этого делать не надо, надо снять реальную яркость пикселя

L из HSL - это "не чернобелое изображение" по формуле: Y = 0.3R + 0.59G + 0.11B. Это "множитель", в канале, для построения цвета, он не для того чтобы на него смотрели глазами. + Гамма коррекция применяется при выводе готового цвета.

Не знаю в чем дело но при помощи матпарсера и элемента toRGB не получается ничего сделать.

Add(MainForm,3894380,126,119)
{
Width=462
Height=528
}
Add(Image,1352448,252,84)
{
Left=20
Top=15
Width=200
Height=200
Point(ImageHeight)
Point(ImageWidth)
Point(Handle)
}
Add(Image,15109500,525,84)
{
Left=240
Top=15
Width=200
Height=200
Point(Handle)
}
Add(Button,9147465,126,189)
{
Left=200
Top=230
link(onClick,13645465:doFor,[])
}
Add(Img_GetPoint,10060352,273,189)
{
DrawSource=1
link(onGetPixel,9553592:doEvent1,[])
link(Bitmap,1352448:Handle,[])
link(X,5091942:Var2,[])
link(Y,9919725:Var2,[])
}
Add(Img_Point,13693910,532,189)
{
DrawSource=1
Color=16777215
Point(X)
Point(Y)
Point(Color)
link(Bitmap,15109500:Handle,[])
link(X,5091942:Var3,[(545,177)])
link(Y,9919725:Var3,[(552,171)])
link(Color,12275428:Value,[(559,177)(572,177)(572,233)(489,233)])
}
Add(For,13645465,175,189)
{
link(onEvent,9702025:doFor,[])
link(End,1352448:ImageHeight,[(188,132)(265,132)])
}
Add(For,9702025,224,189)
{
link(onEvent,10060352:doGetPixel,[])
link(End,1352448:ImageWidth,[(237,153)(272,153)])
}
Add(GetDataEx,9919725,287,166)
{
Angle=3
link(Data,16740594:Var3,[(215,171)(215,235)])
}
Add(GetDataEx,5091942,280,172)
{
Angle=3
link(Data,15022378:Var3,[(264,177)(264,232)])
}
Add(InlineCode,4885515,413,189)
{
WorkPoints=#6:doWork|
EventPoints=#5:onRes|
Code=#15:unit HiAsmUnit;|12:// Autor Tad|0:|9:interface|0:|37:uses Windows,kol,Share,Debug,GDIPAPI;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|19: onRes:THI_Event;|49: procedure doWork(var _Data:TData; Index:Word);|5: end;|22:// Y=0.21R+0.72G+0.07B|14:implementation|29:procedure THiAsmClass.doWork;|17:var i,cl:integer;|5:BEGIN|22: i:= toInteger(_Data);|32: cl := Round(0.21*GetRValue(i)+ |36: 0.72*GetGValue(i)+ |37: 0.07*GetBValue(i)); |0:|34: _hi_onEvent(onRes,RGB(cl,cl,cl));|4:END;|4:end.|
link(onRes,12275428:doValue,[])
}
Add(Memory,12275428,483,189)
{
link(onData,13693910:doDraw,[])
}
Add(Image,7652832,546,259)
{
Left=125
Top=270
Width=200
Height=200
Point(Handle)
}
Add(Img_Point,5848231,553,385)
{
DrawSource=1
Color=16777215
Point(X)
Point(Y)
Point(Color)
link(Bitmap,7652832:Handle,[])
link(X,15022378:Var2,[(566,311)(230,311)])
link(Y,16740594:Var2,[(573,312)(181,312)])
link(Color,7091229:Value,[(580,373)(593,373)(593,429)(510,429)])
}
Add(Memory,7091229,504,385)
{
Default=Real(0)
link(onData,5848231:doDraw,[])
}
Add(Hub,9553592,329,189)
{
link(onEvent1,4885515:doWork,[])
link(onEvent2,7997199:doGetRGB,[(375,202)(375,391)])
}
Add(ToRGB,7997199,392,385)
{
Color=12632256
link(onResult,9422614:doCalc,[])
link(Color,10060352:Color,[(398,303)(279,303)])
}
Add(FastMathParse,9422614,455,385)
{
DataCount=3
MathStr="(0.21 * %1) + (0.72 * %2) + (0.07 * %3)"
ResultType=0
link(onResult,7091229:doValue,[])
link(X1,7997199:R,[(461,373)(433,373)(433,429)(398,429)])
link(X2,7997199:G,[(468,373)(436,373)(436,429)(405,429)])
link(X3,7997199:B,[(475,373)(447,373)(447,429)(412,429)])
}
Add(GetDataEx,15022378,224,227)
{
link(Data,9702025:Position,[])
}
Add(GetDataEx,16740594,175,230)
{
link(Data,13645465:Position,[])
}


карма: 0

0
Ответов: 16884
Рейтинг: 1239
#22: 2012-02-17 10:38:00 ЛС | профиль | цитата
login писал(а):
А я, из задачи понял, что этого делать не надо, надо снять реальную яркость пикселя
ashkalov писал(а):
оттенок контраст яркость цвета
Цвет и Свет разные понятия.
Наука писал(а):
Яркостью цвета принято называть степень близости данного цвета к белому или черному.
При шкале в 255 единиц чисто красный ЦВЕТ на 76 единиц ярче черного или на 179 единиц темнее белого.
login писал(а):
Не знаю в чем дело
А чё там знать ? В 04:58 спать надо, а не маяться
code_26904.txt

------------ Дoбавленo в 10.38:
И про
login писал(а):
реальную яркость пикселя
Запусти программу,прицелься на кнопку, выключи монитор (реальная яркость пикселя=0) и щелкни мышкой. Через время включи монитор и посмотри на картинку. Вот тебе и "реальная".
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_26904.txt [3.3KB] [119]
Ответов: 1429
Рейтинг: 50
#23: 2012-02-17 13:49:13 ЛС | профиль | цитата
Tad, для начала, то, что могу быстро показать вот.

ex1e.png

Обратите внимание(хоть выключайте, хоть включайте монитор), что светлота цвета в области "курточек", на картинке, у вас темнее не только, чем она выглядит после преобразования в софте, но и чем в исходном, цветном варианте. Цвет изначально был светлый!

Вы сделали преобразование яркостной составляющей по формату Rec. 709 [offtop](Y’ = 0.2126 R’ + 0.7152 G’ + 0.0722 B’)[/offtop] а я, и софт, по формату Rec. 601 [offtop](Y’ = 0.299 R’ + 0.587 G’ + 0.114 B’)[/offtop] он же Ccir601. Но это не важно, я пытался сказать что для переноса цвета, пипеткой внутри компа, эти коэффициенты не нужны.
[offtop]кстати, эти две формулы можно добавить, как опции, в элемент GrayScale [/offtop]

Потом сделаю 100% убедительный тест(если смогу ): "как пипеткой перенести цвет из одного места в другое(через HSL)" и что если сделать это по вашей формуле, то цвет восстановить не удастся.
[offtop][/offtop]
карма: 0

0
файлы: 1ex1e.png [375KB] [384]
Ответов: 16884
Рейтинг: 1239
#24: 2012-02-18 17:08:39 ЛС | профиль | цитата
login,Всё оказалось намного проще.
lar.rar
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1lar.rar [129.2KB] [104]
Ответов: 1429
Рейтинг: 50
#25: 2012-02-19 00:22:51 ЛС | профиль | цитата
Tad,
канал L из HSL, ддя Windows(sRGB), Выглядит светлее, чем среднее значение поэтому пипетка выдаcт другой цвет.. D65 + sRGB вроде, наиболее близкое сочетание. Есть много формул(стандартов) компенсации Яркости, при конвертации из RGB в другие пространства
formul1.png
formul2.png




карма: 0

0
файлы: 2formul1.png [4.2KB] [258], formul2.png [2KB] [372]
Ответов: 16884
Рейтинг: 1239
#26: 2012-02-19 01:00:57 ЛС | профиль | цитата
login писал(а):
канал L из HSL
так что нужен конвертор RGB2HSL ? Мне не нужно, да вроде такое никому не нужно.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1429
Рейтинг: 50
#27: 2012-02-19 09:02:32 ЛС | профиль | цитата
Tad, пока не нужен.
Мы просто обсудили эту тему, потому, что HSL - второе цевтовое пространство винды.
карма: 0

0
Ответов: 1429
Рейтинг: 50
#28: 2012-02-22 19:52:52 ЛС | профиль | цитата
Ну вот, и мне, остро, понадобилось это цв-пространство

Сделал преобразование из RGB в HSL (внутреннее преобразование c точностью float, если кому-то надо, может себе вывести):
code_26978.txt

Делаю обратный преобразователь.
Потом буду в FTCG запихивать, для своих нужд
------------ Дoбавленo в 19.52:
А вот с обратным преобразованием:


Add(MainForm,858959,126,112)
{
Width=553
Height=390
Color=2105376
Caption="RGB To HSL"
Position=1
link(onCreate,16015009:doOpen,[])
}
Add(ToRGB,14403412,252,126)
{
link(onResult,3613068:in1,[])
}
Add(ListBox,16297907,644,126)
{
Left=20
Top=20
Width=495
Height=315
Font=[Arial,24,0,0,204]
}
Add(InlineCode,3613068,336,126)
{
@Hint=#10:RGB >> HSL|
WorkPoints=#3:in1|
EventPoints=#4:out1|
VarPoints=#2:H_|2:S_|2:L_|
DataPoints=#2:R_|2:G_|2:B_|
Code=#15:unit HiAsmUnit;|0:|9:interface|13://by Login :)|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: R:real;|10: G:real;|10: B:real;|3: |14: var_R:real;|14: var_G:real;|14: var_B:real;|3: |16: var_Min:real;|17: var_Max:real; |16: del_Max:real;|3: |10: H:real;|10: S:real;|10: L:real;|3: |14: Hi:integer;|14: Si:integer;|14: Li:integer;|3: |14: del_R:real;|14: del_G:real;|14: del_B:real;|3: |14: Temp1:real;|14: Temp2:real;|14: Temp3:real;|14: Temp4:real;|3: |3: |9: public|18: out1:THI_Event;|16: R_:THI_Event;|16: G_:THI_Event;|16: B_:THI_Event;|3: |48: procedure in1(var Data:TData; index:word); |44: procedure H_(var Data:TData; index:word);|44: procedure S_(var Data:TData; index:word);|44: procedure L_(var Data:TData; index:word);|3: |5: end;|0:|14:implementation|0:|26:procedure THiAsmClass.in1;|0:|5:begin|0:|27:R := ReadInteger(Data, R_);|27:G := ReadInteger(Data, G_);|27:B := ReadInteger(Data, B_);|0:|19://RGB from 0 to 255|41:var_R := ( R / 255 ); |21:var_G := ( G / 255 );|21:var_B := ( B / 255 );|0:|0:|19://Min. value of RGB|23:if (var_R < var_G) then|9: begin|24: Temp1 := var_R;|7: end|12: else|9: begin|24: Temp1 := var_G;|13: end; |0:|23:if (var_B < Temp1) then|9: begin|26: var_Min := var_B;|7: end|16: else|9: begin|26: var_Min := Temp1;|9: end; |0:|0:|19://Max. value of RGB|23:if (var_R > var_G) then|9: begin|24: Temp2 := var_R;|7: end|12: else|9: begin|24: Temp2 := var_G;|13: end; |0:|23:if (var_B > Temp2) then|9: begin|26: var_Max := var_B;|7: end|16: else|9: begin|26: var_Max := Temp2;|9: end; |0:|0:|0:|59:del_Max := var_Max - var_Min; //Delta RGB value|0:|31:L := ( var_Max + var_Min ) / 2;|0:|73:if ( del_Max = 0 ) then //This is a gray, no chroma...|5:begin|68: H := 0; //HSL results from 0 to 1|11: S := 0;|3:end|0:|4:else|55: //Chromatic data...|5:begin|24: if ( L < 0.5 ) then|10: begin|44: S := del_Max / ( var_Max + var_Min );|8: end|19: else |10: begin|48: S := del_Max / ( 2 - var_Max - var_Min );|9: end;|5: |5: |72: del_R := ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|72: del_G := ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|72: del_B := ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max;|0:|31: if ( var_R = var_Max ) then|8: begin|22: H := del_B - del_G;|8: end |8: else |8: begin|33: if ( var_G = var_Max ) then|11: begin|42: H := ( 1 / 3 ) + del_R - del_B;|9: end|10: else|12: begin |41: if ( var_B = var_Max ) then |50: H := ( 2 / 3 ) + del_G - del_R; |32: end; |11: end;|7: end;|0:|73://Лимитер есть, но нельзя превышать уровни цветов больше чем в 2 раза.. |20: if ( H < 0 ) then|12: begin|23: H := H + 1;|11: end;|12: |20: if ( H > 1 ) then|12: begin|23: H := H - 1;|11: end;|0:|42://Понизить точность с float до 240 едениц.|24: Hi := round(240 * H);|24: Si := round(240 * S);|24: Li := round(240 * L);|0:|25:_hi_OnEvent(out1, '); |3: |4:end;|0:|14://нижние точки|53:procedure THiAsmClass.H_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Hi);|4:end;|0:|53:procedure THiAsmClass.S_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Si);|4:end;|0:|53:procedure THiAsmClass.L_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Li);|4:end;|0:|0:|4:end.|
link(out1,9542371:in1,[])
link(R_,14403412:R,[(342,114)(310,114)(310,170)(258,170)])
link(G_,14403412:G,[(349,114)(317,114)(317,170)(265,170)])
link(B_,14403412:B,[(356,114)(324,114)(324,170)(272,170)])
AddHint(-27,56,77,13,@Hint)
}
Add(ColorDialog,16015009,196,126)
{
link(onSelect,14403412:doGetRGB,[])
}
Add(Hub,1873164,490,126)
{
OutCount=3
link(onEvent1,15724646:doString,[])
link(onEvent2,5330558:doString,[(522,139)(522,174)])
link(onEvent3,11075453:doString,[(513,146)(513,223)])
}
Add(InlineCode,9542371,406,126)
{
@Hint=#10:HSL >> RGB|
WorkPoints=#3:in1|
EventPoints=#4:out1|
VarPoints=#2:R_|2:G_|2:B_|
DataPoints=#2:H_|2:S_|2:L_|
Code=#15:unit HiAsmUnit;|0:|9:interface|13://by Login :)|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|10: H:real;|10: S:real;|10: L:real;|6: |10: R:real;|10: G:real;|10: B:real;|3: |14: Ri:integer;|14: Gi:integer;|14: Bi:integer;|3: |14: var_1:real;|14: var_2:real;|0:|14: Temp1:real;|14: Temp2:real;|6: |9: public|18: out1:THI_Event;|16: H_:THI_Event;|16: S_:THI_Event;|16: L_:THI_Event;|3: |48: procedure in1(var Data:TData; index:word); |44: procedure R_(var Data:TData; index:word);|44: procedure G_(var Data:TData; index:word);|44: procedure B_(var Data:TData; index:word);|50: function Hue_2_RGB (var v1, v2, vH :real):real;|3: |5: end;|0:|14:implementation|0:|26:procedure THiAsmClass.in1;|0:|5:begin|0:|39:H := (1 / 240) * ReadInteger(Data, H_);|39:S := (1 / 240) * ReadInteger(Data, S_);|39:L := (1 / 240) * ReadInteger(Data, L_);|0:|0:|0:|0:|60:if ( S = 0 ) then //HSL from 0 to 1|9: begin|70: Ri := Round(255 * L) ; //RGB results from 0 to 255|29: Gi := Round(255 * L) ;|29: Bi := Round(255 * L) ;|7: end|4:else|9: begin|28: if ( L < 0.5 ) then |21: begin |35: var_2 := L * ( 1 + S );|19: end |23: else |17: begin|43: var_2 := ( L + S ) - ( S * L );|16: end;|7: |21: |35: var_1 := 2 * L - var_2; |31: Temp1 := H + ( 1 / 3 );|62: Ri := Round(255 * Hue_2_RGB( var_1, var_2, Temp1 )); |56: Gi := Round(255 * Hue_2_RGB( var_1, var_2, H ));|8: |31: Temp2 := H - ( 1 / 3 );|64: Bi := Round(255 * Hue_2_RGB( var_1, var_2, Temp2 )); |8: end;|8: |29:_hi_OnEvent(out1, '); |4:end;|0:|1: |0:|80://------------------------------------------------------------------------------|20://Function Hue_2_RGB|59:function THiAsmClass.Hue_2_RGB (var v1, v2, vH :real):real;|13: |5:begin|23: if ( vH < 0 ) then |9: begin|21: vH := vH + 1; |8: end;|4: |23: if ( vH > 1 ) then |9: begin|19: vH := vH - 1; |8: end;|4: |30: if ( ( 6 * vH ) < 1 ) then|10: begin |44: result := ( v1 + ( v2 - v1 ) * 6 * vH );|10: Exit; |8: end;|4: |30: if ( ( 2 * vH ) < 1 ) then|10: begin |19: result := v2 ;|9: Exit;|8: end;|8: |30: if ( ( 3 * vH ) < 2 ) then|9: begin|60: result := ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 );|9: Exit;|12: end; |4: |13:result := v1;|4:end;|0:|0:|0:|14://нижние точки|53:procedure THiAsmClass.R_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Ri);|4:end;|0:|53:procedure THiAsmClass.G_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Gi);|4:end;|0:|53:procedure THiAsmClass.B_(var Data:TData; index:word);|5:begin|22: dtInteger(Data, Bi);|4:end;|0:|0:|4:end.|
link(out1,1873164:doEvent1,[])
link(H_,3613068:H_,[(412,114)(377,114)(377,170)(342,170)])
link(S_,3613068:S_,[(419,114)(384,114)(384,170)(349,170)])
link(L_,3613068:L_,[(426,114)(391,114)(391,170)(356,170)])
AddHint(-27,-40,77,13,@Hint)
}
Add(FormatStr,15724646,539,126)
{
DataCount=1
Mask="R %1"
link(onFString,10400009:doWork2,[])
link(Str1,9542371:R_,[(545,114)(450,114)(450,172)(412,172)])
}
Add(FormatStr,5330558,539,168)
{
DataCount=1
Mask="G %1"
link(onFString,2387884:doWork2,[])
link(Str1,9542371:G_,[(545,163)(419,163)])
}
Add(FormatStr,11075453,539,217)
{
DataCount=1
Mask="B %1"
link(onFString,2387884:doWork3,[(606,223)])
link(Str1,9542371:B_,[(545,208)(426,208)])
}
Add(HubEx,10400009,602,126)
{
link(onEvent,16297907:doAdd,[])
}
Add(HubEx,2387884,602,168)
{
Angle=3
link(onEvent,10400009:doWork3,[])
}


карма: 0

1
файлы: 1code_26978.txt [5.2KB] [120]
Голосовали:ashkalov
Ответов: 16884
Рейтинг: 1239
#29: 2012-02-23 00:01:30 ЛС | профиль | цитата
login,
// Зачем делать так
H := (1 / 240) * ReadInteger(Data, H_);
S := (1 / 240) * ReadInteger(Data, S_);
L := (1 / 240) * ReadInteger(Data, L_);

// если можно так
H := ReadInteger(Data, H_)/240;
S := ReadInteger(Data, S_)/240;
L := ReadInteger(Data, L_)/240;

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1429
Рейтинг: 50
#30: 2012-02-23 00:16:11 ЛС | профиль | цитата
Tad, спасибо (я мыслю при помощи еденицы, так и написал, как в школе научили )
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)