Asp.net源码交流论坛 Asp.net交流讨论区Asp.net技术文章Asp.NET技术在线生成网站LOGO

1  /  1  页    1  跳转
发表新主题 回复该主题

标题: Asp.NET技术在线生成网站LOGO

身份:董事长

 
  • UID:2
  • 来自:北京
  • 精华:27
  • 积分:1622
  • 帖子:1433
  • 注册: 2007-05-17
  • 状态: 离线
  • 威望:54.00
  • 金钱:261.25 元
 
源码发布专家

Asp.NET技术在线生成网站LOGO

也许大家一看标题就知道,又是老生常谈了,在线生成LOGO其实就是在线生成图片,原理听起来很简单:
1. new一个bitmap或类似之物;
2. 用一个graphic在上边画出你想要的东西;
3. 保存,显示出来,大功告成.
今天要说的是生成中的一些细节问题.没有真正做过,你可能永远也不知道有这样的问题.下边提到的问题和代码,希望对各位有所帮助.

一. 字体位置.
用不同的字体,如果通过计算字体高度来给字体定位是不精确的,不同的字体有不同的em baseline,而且descending 和 ascending 得出来的值几乎很难用来算精确高度,更麻烦的是如果字体是某人造的,那EM更靠不住,最大的问题是文字上方的空白目前我没有找到适合的公式来计算.我用的是比较笨的办法,计算精确的字体高度:


private static int[] GetRealFontHeight(Bitmap bmp)
{
int width, height;
int frequency = 2;// higher frequency gets lower performance.
int[] ret = new int[2];
Color c;
bool goOut = false;
for (height = 1; height < bmp.Height - 1; height += frequency)
{
for (width = 1; width < bmp.Width - 1; width += frequency)
{
c = bmp.GetPixel(width, height);
if (c.Name.Length>0 && c.Name != "0")//got it!
{
ret[0] = height;
goOut = true;
break;
}
else
{
goOut = false;
}
}
if (goOut)
break;
}
goOut = false;
for (height = bmp.Height - 1; height > 1; height -= frequency)
{
for (width = bmp.Width - 1; width > 1; width -= frequency)
{
c = bmp.GetPixel(width, height);
if (c.Name.Length > 0 && c.Name != "0")
{
ret[1] = height;
goOut = true;
break;
}
else
{
goOut = false;
}
}
if (goOut)
break;
}
return ret;
}


在画图之前,用这个方法确定精确的字体高度,这样的染色的时候才不至于走样.大家可以通过http: //www.ladysolution.cn/logo.aspx 生成图片看一下效果.如果用GDI+自带的计算高度的方法,比如GetHeight()和Height属性,在blend的时候换个字体必定有误差.
二. 画倒影, RotateFlip依然是主力
倒影倒是很简单,把BLEND设好,定位好,画出来就行:


Create mirror#region Create mirror
…….
Graphics gBack_mirror = Graphics.FromImage(backImage_mirror);
pStart = new Point(1, -pre[0]);
pEnd = new Point(1, pre[1] - pre[0]);
LinearGradientBrush backColor_mirror = new LinearGradientBrush(pStart, pEnd, Color.White, endColor);
……
gBack_mirror.DrawString(logoText, logoFont, backColor_mirror, new PointF(.0f, -pre[0]));
……
gBack.DrawImage(backImage_mirror, new Point(0, pre[1]+3));
#endregion


三. 计算好你的下笔点,通过第一点中的方法,可以拿到某字体在某size时的实际高度有多少,这样我们在画笔或写字之前通过调用此方法就可以得出你的着笔点的坐标:


private static int[] prerendText(int LogoWidth, int LogoHeight, string logoText, Font logoFont)
{
Bitmap bp = new Bitmap(LogoWidth, LogoHeight);
Graphics g = Graphics.FromImage(bp);
g.DrawString(logoText, logoFont, SystemBrushes.Info, new PointF(.0f, .0f));
int[] ret = new int[2];
ret = GetRealFontHeight(bp);
g.Dispose();
bp.Dispose();
return ret;
}


此方法返回某字体在某size下的最上方坐标和最下方坐标,有了坐标就好办事了:



int[] pre = prerendText(LogoWidth, LogoHeight, logoText, logoFont);
……
Point pStart = new Point(1, pre[0]-2);
Point pEnd = new Point(1, pre[1]+2);
LinearGradientBrush backColor = new LinearGradientBrush(pStart, pEnd, startColor, endColor);
return filename;


本文的示例程序:http://www.ladysolution.cn/logo.aspx
 
技术问题请直接发布到论坛
问题搜索请点击
引用 回复
 

身份:部门主管

 
  • UID:9044
  • 来自:河北省
  • 精华:0
  • 积分:238
  • 帖子:216
  • 注册: 2008-03-07
  • 状态: 离线
  • 威望:25.00
  • 金钱:23.85 元

回复:Asp.NET技术在线生成网站LOGO

太经典了.我试试
引用 回复
 

身份:部门主管

 
  • UID:1243
  • 来自:北京
  • 精华:3
  • 积分:215
  • 帖子:194
  • 注册: 2007-10-15
  • 状态: 离线
  • 威望:6.00
  • 金钱:28.25 元

回复:Asp.NET技术在线生成网站LOGO

好东西,收藏
引用 回复
 

身份:学员

 
  • UID:1624
  • 来自:
  • 精华:0
  • 积分:1
  • 帖子:1
  • 注册: 2007-12-04
  • 状态: 离线
  • 威望:0.00
  • 金钱:0.10 元

回复: Asp.NET技术在线生成网站LOGO

能提供全部源码就好了。
引用 回复
 

身份:学员

 
  • UID:5610
  • 来自:
  • 精华:0
  • 积分:1
  • 帖子:1
  • 注册: 2008-01-19
  • 状态: 离线
  • 威望:0.00
  • 金钱:0.10 元

回复:Asp.NET技术在线生成网站LOGO

太牛X了
引用 回复
 

身份:工程师

 
  • UID:11087
  • 来自:内蒙古
  • 精华:0
  • 积分:129
  • 帖子:119
  • 注册: 2008-03-25
  • 状态: 离线
  • 威望:10.00
  • 金钱:12.35 元

回复:Asp.NET技术在线生成网站LOGO

学习了 谢谢!
引用 回复
 
2008-05-08 09:55
|

身份:学员

 
  • UID:16318
  • 来自:
  • 精华:0
  • 积分:10
  • 帖子:10
  • 注册: 2008-05-06
  • 状态: 离线
  • 威望:0.00
  • 金钱:1.00 元

回复:Asp.NET技术在线生成网站LOGO

哎!如果可以有全部代码就好了!
引用 回复
 

身份:工程师

 
  • UID:1267
  • 来自:西安
  • 精华:0
  • 积分:180
  • 帖子:180
  • 注册: 2007-11-30
  • 状态: 离线
  • 威望:0.00
  • 金钱:18.75 元

回复:Asp.NET技术在线生成网站LOGO

厉害!
引用 回复
 
1  /  1  页    1  跳转
发表新主题 回复该主题

现在时间是:2008-11-24 04:13:38 京ICP备06046876号