要求:
1,输出的文字在矩形中央,不能超过矩形区域.
2,输入的文字字体为宋体.应该是将矩形将最小边长,折算为正方形,在该正方形内输出文本吧.
因为汉字都是方块字.要输出多大的字体才合适呢?怎么进行精确计算.
1,输出的文字在矩形中央,不能超过矩形区域.
2,输入的文字字体为宋体.应该是将矩形将最小边长,折算为正方形,在该正方形内输出文本吧.
因为汉字都是方块字.要输出多大的字体才合适呢?怎么进行精确计算.
Canvas.Font.Name:= 'Arial';
Canvas.Font.Size:= 10;TxtWidth := R.TextWidth('我'); //单个汉字的宽度
TxtHeight:=R.TextHeight('我'); //单个汉字的高度//下面计算一个字符串所占的矩形区域
R.Left := 0;
R.Right:= Canvas.TextWidth('输出文字');
R.Top := 0;
R.Bottom:= Canvas.TextHeight('输出文字');
目前条件是已经矩形区域,再输出文字,也就是我的矩形区域大小已知,但是不知道输出多大的字体,输出的坐标.
如何求呢?而不是根据文字的大小,来设置区域大小输出文本.
注意不要使用canvas.font.size属性,它不是以像素为单位的大小,而是字体“磅”值,是随显示模式的DPI值变化的。
你要将汉字先输出到一个临时的canvas对象
然后使用 Canvas.StretchDraw 对图像进行缩放,这是比较简单的处理方法,但显示可能不够美观。如果想显示美观的话,就需要手工创建Font对象:
var
LogFont: TLogFont;
hOldFont, hNewFont: HFont;
begin
GetObject(Canvas.Font.Handle,SizeOf(LogFont),Addr(LogFont));
LogFont.lfHeight := 30;
LogFont.lfWidth := 20;
hNewFont := CreateFontIndirect(LogFont);
hOldFont := SelectObject(Canvas.Handle,hNewFont);
Canvas.TextOut(20 , 20, 'This is a test string');
hNewFont := SelectObject(Canvas.Handle,hOldFont);
DeleteObject(hNewFont);
end;
(自然语言算法)1、递增循环字体大小,并将字体写出成图形。
2、用图像处理算法计算当前字体大小数值下,字体实际所占的像素值、顶边位置、左边位置
3、纪录步骤2的数据(或者是分析出字体大小与字体实际像素、顶边位置、左边位置之间的数学关系。)经过以上三部,形成成果。
在使用过程中,遇到某未知矩形,就用成果查找到最合适的字体大小和写出坐标。若最合适的字体大小仍不能填满矩形,则对字体图像进行适当的缩放,这样字体填充的效果和效率都是比较合适的。
如果矩形长度是像素的话,
基本上fontsize= 矩形宽度;
如果矩形是英寸的话:
fontsize=矩形 Width *输出设备的分辨率(每英寸像素数)
getdevicecaps :取得设备分辨率。lz是要这个?