社区
GAME,图形处理/多媒体
帖子详情
如何实现任意程度倾斜的斜体字(不是文字的角度)?谢。
ykten
2003-11-09 01:16:30
TLogFont中使字体为斜体只能有固定的倾斜程度,如何实现任意角度的倾斜?
...全文
943
10
打赏
收藏
如何实现任意程度倾斜的斜体字(不是文字的角度)?谢。
TLogFont中使字体为斜体只能有固定的倾斜程度,如何实现任意角度的倾斜?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ykten
2004-02-05
打赏
举报
回复
http://www.china-askpro.com/msg2/qa27.shtml 里面说:
这个函数的难点在于返回的字体数据的格式。我们的时间有限,无法给出VB实例。这里只能给出三篇有关的文章供你参考。如果你能完成VB实例,我们也非常希望能在我们的站点上与大家分享。这三篇文章都来自微软的Knowledge Base(http://support.microsoft.com)。一篇文章是“Q87115 GetGlyphOutline() Native Buffer Format”介绍了Native格式。一篇文章“Q113262 SAMPLE: Plotting TrueType Characters”,这是一个用C语言写的例子,也是关于Native格式,程序比较短,容易看懂。最后一篇是“Q97340 SAMPLE: GetGlyphOutline() Function Demonstration”,这是三篇中最详细的了,其中有一个帮助文件,全面的介绍所有参数的用法,例子也是用C语言写的,比较长。
下面的C++Builder的代码是从网上找到的 。
提取Windows的
TTF字体轮廓矢量数据
西安飞机工业公司设计部 朱朝阳
--------------------------------------------------------------------------------
---- Windows系统的TTF字体具有字体优美、可无级缩放等优点,最适合应用在CAD类图形处理等软件中。直接分析TTF字体的文件格式并读出每个字的轮廓矢量是相当困难的,我们可以借助API函数来方便地获得这些数据。
---- 调用函数GetGlyphOutline可以得到一个字的轮廓矢量或者位图。
---- 函数原型如下:
DWORD GetGlyphOutline(
HDC hdc, // 设备句柄
UINT uChar, // 将要读取的字符
UINT uFormat, // 返回数据的格式
LPGLYPHMETRICS lpgm, // GLYPHMETRICS结构地址
DWORD cbBuffer, // 数据缓冲区的大小
LPVOID lpvBuffer, // 数据缓冲区的地址
CONST MAT2 *lpmat2 // 转置矩阵的地址
);
---- 其中,参数uFormat取值如下:
GGO_NATIVE - 要求函数返回字符的轮廓矢量数据;
GGO_METRICS - 函数仅返回GLYPHMETRICS结构至lpgm;
参数lpgm指向GLYPHMETRICS结构,该结构描述字符的位置。
参数lpmat2指向字符的转置矩阵。
---- 本文以下C++ Builder程序示范如何在画布上以指定的大小绘制字符串。
---- 首先,建立一个新项目,在主窗口上放置一个Image控件,一个Edit控件,一个Button控件;然后,在Button的点击事件中加入如下代码:
#include < stdlib.h >
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRect ClipRect = Rect(0,0,Image1->Width,Image1->Height);
Image1->Picture = 0;
StretchTextRect(Image1->Canvas, ClipRect, Edit1->Text);
}
---- 添加如下子程序:
//---------------------
void TForm1::StretchTextRect(TCanvas
*pCanvas, TRect ClipRect, AnsiString Text)
{
pCanvas->Font->Size = 100;
pCanvas->Font->Name = “宋体";
pCanvas->Pen->Color = clBlack;
pCanvas->Pen->Mode = pmCopy;
pCanvas->Pen->Style = psSolid;
pCanvas->Pen->Width = 1;
int XSize = ClipRect.Width() / Text.Length();
int YSize = ClipRect.Height();
MAT2 mat2; // 转置矩阵,不用变换
mat2.eM11.value = 1;mat2.eM11.fract = 0;
mat2.eM12.value = 0;mat2.eM12.fract = 0;
mat2.eM21.value = 0;mat2.eM21.fract = 0;
mat2.eM22.value = 1;mat2.eM22.fract = 0;
GLYPHMETRICS gm,gmm;
// 首先获得字符的位置矩阵,存入gm
GetGlyphOutlineA(pCanvas->Handle,0x0b0a1,
GGO_METRICS,&gm,0,NULL,&mat2);
char *ptr = Text.c_str();
TRect TheRect;
for(int i = 0;i < Text.Length();) {
int c1 = (unsigned char)*ptr;
int c2 = (unsigned char)*(ptr + 1);
UINT nChar;
TheRect.Left = i * XSize + ClipRect.Left;
TheRect.Top = ClipRect.Top;
TheRect.Right = (i + 2) * XSize + ClipRect.Left;
TheRect.Bottom = ClipRect.Top + YSize;
// 获得当前字符数据的数组的大小
DWORD cbBuffer = GetGlyphOutlineA(pCanvas->
Handle,nChar,GGO_NATIVE,&gmm,0,NULL,&mat2);
if(cbBuffer == GDI_ERROR) break;
void *lpBuffer = malloc(cbBuffer);
if(lpBuffer != NULL) {
// 读入数据置缓冲区
if(GetGlyphOutlineA(pCanvas->
Handle,nChar,GGO_NATIVE,
&gmm,cbBuffer,lpBuffer,&mat2) != GDI_ERROR) {
// 分析数据并绘制字符
TMemoryStream *MBuffer = new TMemoryStream();
MBuffer->Write(lpBuffer,cbBuffer);
MBuffer->Position = 0;
for(;MBuffer->Position < MBuffer->Size;) {
int CurPos = MBuffer->Position;
TTPOLYGONHEADER polyheader;
int ptn = 0;
MBuffer->Read(&polyheader,sizeof(polyheader)); //读入头指针在头后面
ptn++;
for(int j = 0;j < (int)(polyheader.cb //头后的位置开始到头中记录的大小(头加记录)
- sizeof(polyheader));)
{
WORD wtype,cpfx;
MBuffer->Read(&wtype,sizeof(WORD)); //这里度的的是tpolycurve
MBuffer->Read(&cpfx,sizeof(WORD));
MBuffer->Position += cpfx * sizeof(POINTFX); //指针在一个记录的后面tpolyheader+tpolycurve+若干pointfx
j += sizeof(WORD) * 2 + cpfx * sizeof(POINTFX);//j是tpolycurve和后面跟的pointfx的总长度
if(wtype == TT_PRIM_LINE) ptn += cpfx; //若干如果是qspline那么点的数目要三倍?
else ptn += (cpfx - 1) * 3 + 1;
}
TPoint *pts = new TPoint[ptn+1]; // 存储多边形顶点
MBuffer->Position = CurPos; //当前大记录的开始位置
ptn = 0;
MBuffer->Read(&polyheader,sizeof(polyheader)); //读头,指针在头后面
TPoint pt0 = POINTFX2TPoint(polyheader.pfxStart,TheRect,&gm);
pts[ptn++] = pt0; //头位置 点 ptn=1
for(int j = 0;j < (int)(polyheader.cb - sizeof(polyheader));) {
TPoint pt1;
WORD wtype,cpfx;
MBuffer->Read(&wtype,sizeof(WORD));
MBuffer->Read(&cpfx,sizeof(WORD)); //指针在tpolycurve的pointfx位置
POINTFX *pPfx = new POINTFX[cpfx];
MBuffer->Read((void *)pPfx,cpfx * sizeof(POINTFX));
j += sizeof(WORD) * 2 + cpfx * sizeof(POINTFX); //j到了大记录的尾位置
//处理读来的点数组记录
if(wtype == TT_PRIM_LINE) { // 直线段
for(int i = 0;i < cpfx;i++) {
pt1 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pts[ptn++] = pt1;
}
}
else { // Bezier曲线
TPoint p0,p1,p2,p3,p11,p22,pp0,pp1,pp2,pt11,pt22;
int i;
for(i = 0;i < cpfx-1;i++) {
pt11 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pt22 = POINTFX2TPoint(pPfx[i+1],TheRect,&gm);
pp0 = pts[ptn-1];
pp1 = pt11;
pp2.x = (pt11.x + pt22.x)/2;
pp2.y = (pt11.y + pt22.y)/2;
p0 = pp0;
p1.x = pp0.x/3 + 2 * pp1.x/3;
p1.y = pp0.y/3 + 2 * pp1.y/3;
p2.x = 2 * pp1.x/3 + pp2.x/3;
p2.y = 2 * pp1.y/3 + pp2.y/3;
p3 = pp2;
for(float t = 0.0f;t <= 1.0f;t += 0.5f) {
float x = (1-t)*(1-t)*(1-t)*p0.x+
3*t*(1-t)*(1-t)*p1.x+ 3*t*t
*(1-t)*p2.x + t*t*t*p3.x;
float y = (1-t)*(1-t)*(1-t)*p0.y
+ 3*t*(1-t)*(1-t)*p1.y+3
*t*t*(1-t)*p2.y + t*t*t*p3.y;
pts[ptn].x = x;
pts[ptn].y = y;
ptn++;
}
}
pt1 = POINTFX2TPoint(pPfx[i],TheRect,&gm);
pts[ptn++] = pt1;
}
delete pPfx;
}
pts[ptn] = pts[0]; // 封闭多边形
pCanvas->Brush->Color = clWhite;
pCanvas->Pen->Mode = pmXor;
pCanvas->Pen->Style = psClear;
pCanvas->Brush->Style = bsSolid;
pCanvas->Polygon(pts,ptn);
delete pts;
}
delete MBuffer;
}
free(lpBuffer);
}
}
}
//---------------------
TPoint TForm1::POINTFX2TPoint(POINTFX pf,
TRect TheRect,GLYPHMETRICS *gm)
{
TPoint point;
float fx,fy;
fx = pf.x.value + pf.x.fract / 65536.0f + 0.5f;
fx = fx
/ (float)(gm->gmBlackBoxX + gm->gmptGlyphOrigin.x)
* (float)TheRect.Width() + (float)TheRect.Left;
fy = pf.y.value + pf.y.fract / 65536.0f + 0.5f;
fy = ((float)gm->gmBlackBoxY - fy)
/ (float)(gm->gmBlackBoxX + gm->gmptGlyphOrigin.x)
* (float)TheRect.Height() + (float)TheRect.Top;
point.x = int(fx);
point.y = int(fy);
return point;
}
SydPink
2004-02-04
打赏
举报
回复
不好搞。。是倾斜。不是旋转;是图象处理的算法问题,不是程序的问题。控制倾斜角度。。。晕菜。。
flyforlove
2004-01-29
打赏
举报
回复
楼主解决了,就把源代码写出来,让大家参考一下吧。
ykten
2004-01-29
打赏
举报
回复
还是要自己来解决:用GetGlyphOutLine获得文字的轮廓,然后想怎么变形就处理一下,再输出。
ykten
2003-11-20
打赏
举报
回复
找到一种方法:用PlgBlt。但效果不好,锯齿很多。有好点的方法么?
ykten
2003-11-18
打赏
举报
回复
我特意强调的是斜体字的倾斜程度,就是在Flash中把文字进行skew变换时的那种效果
Kingron
2003-11-11
打赏
举报
回复
哈哈,估计搂住想要斜体字,最多倾斜0~180度,大家不要搞错了。
zhxfzhxf1
2003-11-11
打赏
举报
回复
UP
Dlwxn
2003-11-11
打赏
举报
回复
谁说的,我就是用TLogFont做的任意角度倾斜。
xiaoxiao197821
2003-11-10
打赏
举报
回复
这是别人写的程序,用LOGFONT字体:
FillChar(FLogFont,Sizeof(TLogFont),0);
With FlogFont do
begin
lfHeight:=Font.Height;
lfWidth:=0;
lfEscapement:=2700; //想旋转多少度,修改这里的参数就可以了啊
lforientation:=lfEscapement;
lfWeight:=Fw_Normal;
lfItalic:=0;
lfUnderline:=0;
lfStrikeOut:=0;
lfCharSet:=Ansi_CHARSET;
StrPCopy(lfFaceName,Font.Name);
lfQuality:=PROOF_QUALITY;
lfOutPrecision:=OUT_TT_ONLY_PRECIS;
lfClipPrecision:=CLIP_DEFAULT_PRECIS;
lfPitchAndFamily:=Variable_Pitch;
end;
Font.Handle:=CreateFontIndirect(FLogFont);
Textout(x,y,'旋转文字');
Markdown 标记语言
Markdown 标记语言, 对 markdown标记所有20多个标签一一讲解。系统掌握markdown标记语言的使用。01 Markdown 标记语言 课程介绍02 Markdown 标记语言 简介03 Markdown 标记语言 作者简介04 Markdown 标记语言 编辑器推荐05 Markdown 标记语言 基本语法 标题06 Markdown 标记语言 段落 paragraph07 Markdown 标记语言 换行 Line Breaks08 Markdown 标记语言 重点粗体文本 bold09 Markdown 标记语言 重点斜体文本 italic10 Markdown 标记语言 同时粗体和斜体11 Markdown 标记语言 引用 blockquote12 Markdown 标记语言 有序列表 OL13 Markdown 标记语言 无序列表 UL14 Markdown 标记语言 代码 Code15 Markdown 标记语言 代码块 Code Blocks16 Markdown 标记语言 水平线 hr17 Markdown 标记语言 链接 link18 Markdown 标记语言 参考风格的链接19 Markdown 标记语言 图片 image20 Markdown 标记语言 格式化 转义符21 Markdown 标记语言 扩展语法22 Markdown 标记语言 扩展语法 表格 Table23 Markdown 标记语言 表格可视化编辑器 看云24 Markdown 标记语言 表格对齐25 Markdown 标记语言 脚注 Footnotes26 Markdown 标记语言 链接标题ID27 Markdown 标记语言 定义列表 definition list28 Markdown 标记语言 任务列表 复选框29 Markdown 标记语言 流程图 时序图 数学公式30 Markdown 标记语言 结语
Delphi利用Windows GDI
实现
文字
倾斜
一、引言 在Delphi开发环境中,
文字
的输出效果一般都是头上脚下的"正统"字符,如何输出带有一定
倾斜
角度
的
文字
以达到特殊的显示效果呢?笔者在制作公章辅助设计软件过程中,通过Windows图形设备接口函数
实现
了
文字
呈辐射状分布的功能。 Windows图形设备接口(Graphics Device Interface)是Windows系统中的图形核心模块,以GDI.EXE形式提供给
Delphi字符串旋转
任意
角度
万一的例子
//声明: CreateFontIndirect( const p1: TLogFont {字体结构} ): HFONT; {返回新字体指针} //TLogFont 是 tagLOGFONTA 结构的重定义: tagLOGFONTA = packed record lfHeight: Longint; {字体高度} lfWidth: Longint; {字体平均宽度} lfEscapement:
前端--css
cssCSS的发展历程CSS 网页的美容师CSS初识CSS样式规则CSS字体样式属性font-size:字号大小font-family:字体font-weight:字体粗细font-style:字体风格font:综合设置字体样式 (重点)选择器标签选择器(元素选择器)类选择器多类名选择器id选择器id选择器和类选择器区别通配符选择器伪类选择器链接伪类选择器结构(位置)伪类选择器(CSS3)目标伪类选择器(CSS3)CSS注释CSS外观属性color:文本颜色line-height:行间距text-align
基于神经网络的
文字
识别,神经网络如何识别图像
。OCR软件OCR(OpticalCharacterRecognition)软件是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机
文字
的过程;即,对文本资料进行扫描,然后对图像文件进行分析处理,获取
文字
及版面信息的过程。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(IntelligentCharacterRecognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、
GAME,图形处理/多媒体
1,183
社区成员
14,336
社区内容
发帖
与我相关
我的任务
GAME,图形处理/多媒体
Delphi GAME,图形处理/多媒体
复制链接
扫一扫
分享
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章