Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить размер буквы на экране точно? 
:(
    Опции темы
Dims
Дата 22.10.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Как определить размер буквы или строки точно, то есть, С УЧЁТОМ торчащих из некоторых букв палочек и т.п.?
PM MAIL   Вверх
HalkaR
Дата 22.10.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



System.Drawing.Graphics.MeasureString
PM MAIL   Вверх
Dims
Дата 22.10.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Уверены?

Вроде попробовал и получил, что MeasureString не учитывает палочки, например, буква h занимает такой же квадратик, как и n. 

А это не так.
PM MAIL   Вверх
diadiavova
Дата 23.10.2008, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



На сколько я понимаю, с точки зрения системы, символ - это не только то, что отображается, а вся прямоугольная область, которую он занимает. То есть, если написано чёрным по белому, то как чёрные так и белые точки являются частью символа. Поэтому, есть подозрение, что прямого способа выяснить это нет(хотя я могу ошибаться).
Что до кривых способов, то могу предложить следующее:
1.Текст измеряется при помощи MesureString
2.Создаётся битмап такого же размера и заливается белым цветом.
3.Строка прорисовывается в битмап чёрным цветом.
4.Создаём 4 переменные Xmin, Xmax, Ymin, Ymax, для сохранения минимального и максимального значений  X и Y
5.Далее в двойном цикле обходим все пикселы битмапа, и если пиксел чёрный проверяем его координаты с переменными созданными в предыдущем шаге. Если X меньше Xmin, присваиваем новое значение  Xmin, если больше Xmax - новое значение Xmax, с Y - то же самое.

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

Для единичного измерения способ подходящий, а если измерять надо много и часто - приведёт к жутким тормозам.

Можно, конечно поискать встроенную функцию, поэксперементировать с перегруженными версиями межестринг(я пробовал со стрингформатом всякие фортели выделывать ничего не вышло), но если ничего не найдётся, то на крайний случай и мой метод может сгодиться.


======================
Да, кстати, что-то сразу не сообразил, в алгоритме действий можно сделать поменьше. Вместо того, чтобы обходить все пикселы можно просто урезать прямоугольник со всех сторон. Описывать подробно не буду - не уверен, что метод в принципе подойдёт, но если интересно - могу описать в следующий раз.

Это сообщение отредактировал(а) diadiavova - 23.10.2008, 02:57


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Dims
Дата 25.10.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну да, за неимением лучшего я так и делаю, анализирую пиксели.

А никак нельзя получить доступ к векторным данным шрифта?
PM MAIL   Вверх
diadiavova
Дата 25.10.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


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

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



Цитата(Dims @  25.10.2008,  21:11 Найти цитируемый пост)
А никак нельзя получить доступ к векторным данным шрифта?

Я видел вопрос про векторные данные, насколько я знаю в дотнете нет доступа, это надо или в раздел WinAPI закинуть или искать сторонние библиотеки.
Вопрос в другом, я не совсем понял, какие функции у матриц отсутствуют, и что понимать под преобразованием перспективы(так по-моему там было). Если речь о линейном преобразовании, доступном через матрицу, то к элементам матрицы в общем-то и прямой доступ есть. Это куда более естественный способ, чем колодовать через векторные данные букаф.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Experimenter
Дата 29.10.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dims, измерению все поддается. Я этой темой занимался, но потом забросил. Прикладываю солюшен, не говорю, что это законченное решение, можешь продолжить исследования, если интересно. Основывался при написании на книге дядюшки Ч.Петцольда "Программирование для Windows на C#", том 1. Там целая глава шрифтам посвящена.
Также поищи в МСДН тему "How to: Obtain Font Metrics"

Это сообщение отредактировал(а) Experimenter - 29.10.2008, 23:44

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  DiscoverText.rar 83,66 Kb


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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