![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
Как определить размер буквы или строки точно, то есть, С УЧЁТОМ торчащих из некоторых букв палочек и т.п.?
|
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
System.Drawing.Graphics.MeasureString
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
Уверены?
Вроде попробовал и получил, что MeasureString не учитывает палочки, например, буква h занимает такой же квадратик, как и n. А это не так. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 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 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
Ну да, за неимением лучшего я так и делаю, анализирую пиксели.
А никак нельзя получить доступ к векторным данным шрифта? |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Я видел вопрос про векторные данные, насколько я знаю в дотнете нет доступа, это надо или в раздел WinAPI закинуть или искать сторонние библиотеки. Вопрос в другом, я не совсем понял, какие функции у матриц отсутствуют, и что понимать под преобразованием перспективы(так по-моему там было). Если речь о линейном преобразовании, доступном через матрицу, то к элементам матрицы в общем-то и прямой доступ есть. Это куда более естественный способ, чем колодовать через векторные данные букаф. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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"); } |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |