Получить изображение текста с оптимизированным размером шрифта и центрированием в Matlab? - PullRequest
0 голосов
/ 22 декабря 2018

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

  • сколько символов максимум может иметь мой ввод

  • размеры прямоугольника

Он должен:

  • найти лучший размер шрифта и отобразить результат.

Вот код MATLAB

color = 'k';
txt = '1';
howManyCharMaximum = 7;
boxWidth = 250;
boxHeight = 100;

%% comput: Now I assume one char is as wide as tall
howManyChar = strlength(txt);
marginHoriz = mod(boxWidth,howManyCharMaximum); %in points
subRectangle.width = (boxWidth-marginHoriz)/howManyCharMaximum;
subRectangle.height = boxHeight;
[fontSize,idx] = min([subRectangle.width, subRectangle.height]); %the largest square that fits in a rectangle

%%
hFigure = figure('MenuBar', 'none', ...
                 'ToolBar', 'none', ...
                 'Units', 'points', ...
                 'Position', [0 0 boxWidth boxHeight], ... % x y from bottom left of screen to botleft of the fig
                 'Color', 'w'); 
hAxes = axes; hAxes.Visible = 'off';

%pos:=botleft vertex of the string
switch(idx)
    case 1
        x = floor((boxWidth-howManyChar*fontSize)/2);
        y = floor((boxHeight-fontSize)/2);
    case 2
        addMarginHoriz = (subRectangle.width-subRectangle.height)*howManyCharMaximum;
        x = floor((boxWidth-howManyChar*fontSize)/2);
        y = 0;
end
hText = text(x, y, ...
            txt, ...
            'Units', 'points', ...
            'FontSize', fontSize, ...
            'HorizontalAlignment', 'left', ...
            'VerticalAlignment', 'middle', ...
            'Color', color);

Но длянекоторые причины, по которым я не могу понять, это то, что, к сожалению, он возвращает - децентрированный символ:

enter image description here

Кто-нибудь знает, где я допустил ошибкупожалуйста?Заранее благодарю.

1 Ответ

0 голосов
/ 22 декабря 2018

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

color = 'k';
txt = '18998';
%howManyCharMaximum = 7; I didnt use this one
boxWidth = 250;
boxHeight = 100;

%% comput: Now I assume one char is as wide as tall
howManyChar = strlength(txt);
%marginHoriz = mod(boxWidth,howManyCharMaximum); %in points
subRectangle.width = (boxWidth)/howManyChar;
subRectangle.height = boxHeight;
[fontSize,idx] = min([subRectangle.width, subRectangle.height]); %the largest square that fits in a rectangle
%%
hFigure = figure('MenuBar', 'none', ...
                 'ToolBar', 'none', ...
                 'Units', 'points', ...
                 'Position', [0 0 boxWidth boxHeight], ... % x y from bottom left of screen to botleft of the fig
                 'Color', 'w'); 
hAxes = axes; hAxes.Visible = 'off';
%plot(0,0)
%pos:=botleft vertex of the string

x = floor(boxWidth/2);
y = floor(boxHeight/2)

hText = text(0.5, 0.5, ...
            txt, ...
            'Units', 'normalized', ...
            'FontSize', fontSize, ...
            'HorizontalAlignment', 'center', ...
            'VerticalAlignment', 'middle', ...
            'Color', color);

enter image description here

enter image description here

...