Текущий архив: 2006.09.10;
Скачать: CL | DM;
ВнизПиксели и сантиметры Найти похожие ветки
← →
Pavia © (2006-08-20 00:53) [40]
> Ну поделитесь уже конкретной информацией.
> Всем уже жуть как интересно.
Я поделился все информацией, которую имею в наличии. Другая часть засекречена.
Разве, что еще могу добавить, что в 2000 году стандарт изменился. И теперь можно осуществлять контроль над монитором. Имеется в виду делать с монитором то, что можно сделать с кнопок находящихся на мониторе.
Есть монитор он соединен с видео картой. Видео карта может не только выводить информацию на монитор, но прочитать информацию с монитора о его характеристиках. одной из такой характеристик является размеры изображения на мониторе по горизонтали и вертикали в сантиметрах и если доступна более детальные данные то и в миллиметрах. Вот эти значение и получаются при помощи следующих директив.
hsiz := GetDeviceCaps(h,HORZSIZE); {display width in mm}
vsiz := GetDeviceCaps(h,VERTSIZE); {display height in mm}
Осталось узнать разрешение и сделать перерасчет.
← →
McSimm © (2006-08-20 00:56) [41]> И теперь можно осуществлять контроль над монитором. Имеется
> в виду делать с монитором то, что можно сделать с кнопок
> находящихся на мониторе.
Жаль производители мониторов об этом до сих пор не знают и лепят зачем-то дополнительный USB интерфейс для этих целей.
← →
Pavia © (2006-08-20 01:01) [42]Еще могу добавить если не верите мне то возьмите: линейку, рулетку, или сантиметр и померьте.
Про USB на мониторе, мало что знаю. Но выступает в качестве улучшения дизайна, для того чтобы всяки та Flash накопители могильники было проще подключать, к компьютеру.
← →
McSimm © (2006-08-20 01:20) [43]> Про USB на мониторе, мало что знаю.
Не USB на мониторе, а подключение монитора через USB порт компьютера.
Именно для того, чтобы иметь возможность управлять им без кнопок на самом мониторе.
Жаль, что они не научились делать этого по стандарту, который изменился с 2000 года :)
← →
Pavia © (2006-08-20 01:24) [44]Если хотите подробней вам на www.vesa.org только там мало информации лежит в открытом доступе. Советую искать пословам EDID(EXTENDED DISPLAY IDENTIFICATION DATA) и DDC (Display Data Channel).
← →
Мефисто (2006-08-20 01:26) [45]
> Pavia © (20.08.06 00:53) [40]
> Другая часть засекречена.
Кто этот жадный подлец? :)
> Разве, что еще могу добавить, что в 2000 году стандарт изменился.
> И теперь можно осуществлять контроль над монитором. Имеется
> в виду делать с монитором то, что можно сделать с кнопок
> находящихся на мониторе.
Скорее не изменилось, а кое что дополнилось.
> Осталось узнать разрешение и сделать перерасчет.
И так для каждого девайса будем коэффициенты подбивать?
> Еще могу добавить если не верите мне то возьмите: линейку,
> рулетку, или сантиметр и померьте.
Взял, померил. Результат приблизительно, так попадает. Но с моей линейкой, чего-то погрешность более 1,5-2 см. Толи моник у меня кривой, толи линейка :)
← →
Мефисто (2006-08-20 08:39) [46]
> Pavia © (20.08.06 01:24) [44]
Попробуйте-ка получить возвращаемы значения при разных разрешениях дисплея:
> vsiz := GetDeviceCaps(h,VERTSIZE); {display height in
> mm}
Раз по твоему мнению, винда получает точные значения от монитора, то почему при разных разрешениях дисплея вылазят разные цифры? Динамически меняются физические размеры монитора? :)))
Это, так, еще раз тебе на засыпку, чтобы развеять миф в который ты веришь. Получить точные СМ для монитора не реально, придется все время подбивать некий коэффициэнт. А вот для принтеров, можно получить точный расчет.
← →
Anatoly Podgoretsky © (2006-08-20 11:23) [47]Верить не запретишь.
← →
Anatoly Podgoretsky © (2006-08-20 11:48) [48]Произвел проверку
procedure TForm1.TntButton1Click(Sender: TObject);
begin
TntLabel1.Caption := IntToStr(GetDeviceCaps(GetDC(Handle),HORZSIZE));
TntLabel2.Caption := IntToStr(GetDeviceCaps(GetDC(Handle),VERTSIZE));
end;
При разрешении 1920*1200 получил 512*320 что не совсем то, но близко
При разрешении 1600*900 получил 520*292 что то фантастическое
При разрешении 1280*1024 получил 400*320 что то резко сжался монитор
При разрешении 800*600 получил 426*320 что то совсем не в порядке с моим монитором, физические размеры гуляют куда угодно
Как сказал Прудков, не верь глазам своим. Дальше будешь песни петь про DDC
← →
Мефисто (2006-08-20 12:32) [49]
> Anatoly Podgoretsky © (20.08.06 11:48) [48]
Про что всем форумом и разжевываем несчастному :)
Ибо системе пофиг на физический размер пикселя (и межпиксельный шаг) монитора. Для системы главное получить список поддерживаемых разрешений для монитора дабы корректно с данным устройством общаться.
Pavia © (20.08.06 01:24) [44]
Могу еще загвостку подкинуть. Непомню какая компания реализовала следующую технологию для ЭЛТ мониторов. NEC или Sony. Подзабыл как данная технология называлась. Суть в том, что для улучшения качества изображения, физические пиксели монитора имели форму немного вытянутого элипса. И как теперь подсчитывать визический размер сие пикселя? :) Это раз.
Если обратите внимание, то заметите, что пиксели монитора чаще всего расположены в шашечном порядке. (У кинескопов для телевизоров к примеру, эти физические пиксели чаще всего расположены в шахматном порядке). Вот, физические пиксели монитора расположены в шашечном порядке, как опять точно получить размер? Ведть координатная сетка X и Y для вычисления положения пикселя уже не совсем верна. Это два.
На прилавках уйма всяких мониторов. У многих из них свои физические характеристики, разная технология изготовления. Если бы под каждый пришлось подстраиваться в милемтры и сантиметры, чтобы из себя представляла ОС и был бы такой широки выбор мониторов? Это три.
← →
McSimm © (2006-08-20 13:00) [50]> пиксели монитора чаще всего расположены в шашечном порядке.
Не довод.
Компьютер не имеет никаких дел с "физическими пикселями".
Это и не пиксели вовсе. Пиксель отрисовывается несколькими ячейками матрицы монитора.
Координатная сетка XY верна независимо от физического устройства отображающей поверхности.
← →
Мефисто (2006-08-20 13:22) [51]
> McSimm © (20.08.06 13:00) [50]
> Это и не пиксели вовсе. Пиксель отрисовывается несколькими
> ячейками матрицы монитора.
Я и писал физический пиксель монитора подразумевая эту самую ячейку :) А не тот пиксель, который представляется системой. Треп то в ветке пошел с Pavia © узнаем мы вызические размеры в мм или нет. Т.к. по мнению Pavia © в мониторе эти физические данные содержаться и виндовс может получить к ним доступ.
> Компьютер не имеет никаких дел с "физическими пикселями".
Уже писал об этом и не раз, еще в предыдущей ветке на это наставлял.
Повторил об этом еще постом выше:
> Ибо системе пофиг на физический размер пикселя (и межпиксельный
> шаг) монитора. Для системы главное получить список поддерживаемых
> разрешений для монитора дабы корректно с данным устройством
> общаться.
Пример с матрицей физических пикселей монитора привел, чтобы дать понять человеку, что из-за разных характеристик этой матрицы (размер ячейки и шаг между ячейками) невозможно получить реальный размер, даже если бы существовали мнимые сведения о физических характеристиках монитора описываемые Pavia ©.
← →
хм... (2006-08-20 13:49) [52]
> Произвел проверку
> procedure TForm1.TntButton1Click(Sender: TObject);
> begin
> TntLabel1.Caption := IntToStr(GetDeviceCaps(GetDC(Handle),
> HORZSIZE));
> TntLabel2.Caption := IntToStr(GetDeviceCaps(GetDC(Handle),
> VERTSIZE));
> end;
> При разрешении 1920*1200 получил 512*320 что не совсем то,
> но близко
> При разрешении 1600*900 получил 520*292 что то фантастическое
> При разрешении 1280*1024 получил 400*320 что то резко сжался
> монитор
> При разрешении 800*600 получил 426*320 что то совсем не
> в порядке с моим монитором, физические размеры гуляют куда
> угодно
>
> Как сказал Прудков, не верь глазам своим. Дальше будешь
> песни петь про DDC
а я проверил на ноутбуке:
при режиме 1024*768: 320*240
при режиме 800*600: 320*240
как бы практически совпадает...
линейкой мерил: 305*230...
← →
Мефисто (2006-08-20 14:06) [53]
> хм... (20.08.06 13:49) [52]
> как бы практически совпадает...
Вот имено, что как бы :)
Может совпадение?
Мы вот с АП - ЭЛТ мониторы тестили. Размеры скачут как хотят.
Оно же как вроде должно быть константа :)
← →
Anatoly Podgoretsky © (2006-08-20 14:20) [54]Мефисто (20.08.06 14:06) [53]
Я тестировал LCD c цифровым интерфейсом! Где гарантирован размер, органы управления им заблокированы, никаких проблем, как в случае аналогового интерфейса.
И еще у меня два монитора, вне зависимости от того на каком мониторе происходил запуск размеры не меняли, только при изменении разрешения, он почему вдруг становился резко уже.
← →
vrem (2006-08-20 14:22) [55]Эскперимент - пусть каждый измерит.
← →
Мефисто (2006-08-20 14:22) [56]
> Anatoly Podgoretsky © (20.08.06 14:20) [54]
Вах, хороший у Вас LCD с таким высоким разрешением. А я думал по разрешениям это ЭЛТ :)
← →
Anatoly Podgoretsky © (2006-08-20 14:26) [57]Мефисто (20.08.06 14:22) [56]
Вообще то у меня слабый монитор, просто М9 не потянул, точнее посчитал не экономичным для дома.
← →
хм... (2006-08-20 14:57) [58]цифры там и вправду лгут, сейчас написал маленькую программку которая должна нарисовать исходя из этих пикселей квадрат 10см*10см, в итоге в обоих режимах рисовался квадрат 9,5*9,5...
или может у меня линейка неправильная? :)))
← →
Anatoly Podgoretsky © (2006-08-20 15:35) [59]Линейка у тебя правильная, просто под каждый монитор и разрешение нужна своя линейка.
← →
Pavia © (2006-08-20 16:17) [60]Посмотрел при разных разрешениях. Виндоус как то хитро меняет цифры, а не должен.
← →
Anatoly Podgoretsky © (2006-08-20 16:22) [61]Вот именно согласно тебе не должен, поскольку размер монитора не меняется. Отсюда сделай вывод насчет этой функии сам.
← →
Pavia © (2006-08-20 16:31) [62]Anatoly Podgoretsky
Я сделал вывод. Попробую получить эти сантиметры другим методом.
← →
Мефисто (2006-08-20 16:40) [63]
> Pavia © (20.08.06 16:31) [62]
Ждем с нетирпением ;)
Хорошая ветка получилась. Может еще этот вопрос на других форумах задать :)
← →
Pavia © (2006-08-20 17:09) [64]Я пока до WMI, но вот функция с карактеровкой. На LSD мониторах должна давать точный результат, а вот на ЖК надо проверить.
function MaxHORRES:DWord;
var
i: Integer;
DevMode : TDeviceMode;
begin
Result:=0;
i:=0;
while EnumDisplaySettings(nil,i,DevMode) do
with Devmode do
begin
if dmPelsWidth>Result then Result:=dmPelsWidth;
inc(i);
end;
end;
procedure CmPerPixel(canvas:TCanvas; var xcmpp,ycmpp: Real);
var h:HDC;
MHRes,hres,vres,hsiz,vsiz:integer;
begin
MHRes:=MaxHORRES;
h:=canvas.handle;
hres := GetDeviceCaps(h,HORZRES); {display width in pixels}
vres := GetDeviceCaps(h,VERTRES); {display height in pixels}
hsiz := GetDeviceCaps(h,HORZSIZE); {display width in mm}
vsiz := GetDeviceCaps(h,VERTSIZE); {display height in mm}
xcmpp := hres/MHRes*hsiz/hres*0.1;
ycmpp := hres/MHRes*vsiz/vres*0.1;
end;
← →
Virgo_Style © (2006-08-20 17:53) [65]ну не взлетит же.
где зависимость от координаты?
← →
Pavia © (2006-08-21 00:44) [66]Взлетит куда дентся. :D
Я решил из реестра прочитать информацию о мониторе. ;)
Должно работать в WinNT(WinXP, Win2K).
function ReadEDID(EDID:PByte):Boolean;
var
MyKey:HKey; { Handle для работы с разделом }
StrKey:String;
Buf:array[0..1023] of char; { Буфер }
Err, i:longint;
RegData:DWord;
begin
Result:=True;
StrKey:="SYSTEM\ControlSet001\Enum\DISPLAY\";
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
{Определили имя первого подраздела }
Err:=RegEnumKey(MyKey,0,Buf,Sizeof(Buf));
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
StrKey:=StrKey+Buf+"\";
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
{Определили имя первого подраздела }
Err:=RegEnumKey(MyKey,0,Buf,Sizeof(Buf));
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
StrKey:=StrKey+Buf+"\Device Parameters\";
Err:=RegOpenKey(HKEY_LOCAL_MACHINE,@StrKey[1],MyKey); { Открыли раздел }
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
i:=256;
RegData:=REG_BINARY;
Err:=RegQueryValueEX(MyKey,"EDID",nil,@RegData,PByte(EDID),@i);
if Err<> ERROR_SUCCESS then
begin
Result:=False;
Exit;
end;
end;
procedure CmPerPixel(var xcmpp,ycmpp: Real);
var
hres,vres,hsiz,vsiz:integer;
Buf:array [0..255] of Byte;
i:Integer;
c:Byte;
begin
hres := GetSystemMetrics(Sm_Cxscreen); {display width in pixels}
vres := GetSystemMetrics(Sm_CYscreen); {display height in pixels}
hsiz := 0;
vsiz := 0;
if ReadEDID(@buf) then
begin
c:=0;
for i:= 0 to 127 do c:=c+Buf[i]; {Check summ}
if c=0 then
begin
hsiz:=buf[21]*10;
vsiz:=buf[22]*10;
for i:=0 to 3 do
case buf[54+i*18+3] of
$FA..$FF:;
else
begin
hsiz:=buf[54+i*18+12]+((buf[54+i*18+14] and $F0)shl 4); {H_SIZE}
vsiz:=buf[54+i*18+13]+((buf[54+i*18+14] and $0F)shl 8); {V_SIZE}
end;
end;
end;
end;
xcmpp := hsiz/hres*0.1;
ycmpp := vsiz/vres*0.1;
end;
← →
Pavia © (2006-08-21 01:38) [67]Я тут подумал новерно надо заменить "ControlSet001" на "CurrentControlSet".
← →
guav © (2006-08-21 01:54) [68]> Я решил из реестра прочитать информацию о мониторе. ;)
А я решил не ставить драйвер для монитора :-p
> {Определили имя первого подраздела }
А первым у меня там вообще телевизор идёт ;-)
← →
KilkennyCat © (2006-08-21 01:59) [69]> [68] guav © (21.08.06 01:54)
> А первым у меня там вообще телевизор идёт ;-)
С барахлящим строчником ;)
← →
Pavia © (2006-08-21 02:05) [70]
> А я решил не ставить драйвер для монитора :-p
А это зависет от драйвера видео карты, а не от монитора :-p
← →
KilkennyCat © (2006-08-21 02:14) [71]> [70] Pavia © (21.08.06 02:05)
неправда.
← →
guav © (2006-08-21 02:17) [72]
> А это зависет от драйвера видео карты, а не от монитора
> :-p
Возможно. всё равно у телевизора ключика EDID нет.
← →
Virgo_Style © (2006-08-21 08:30) [73]Pavia © (21.08.06 0:44) [66]
Точечная статическая модель. несерьезно. Предъявите динамическую распределенную - будет тема для разговора...
Страницы: 1 2 вся ветка
Текущий архив: 2006.09.10;
Скачать: CL | DM;
Память: 0.61 MB
Время: 0.044 c