当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 如何用.NET技术在线生成网站LOGO

ASP.NET
asp.net css注释的影响
ASP.NET与数据库相关技巧
关于HtmlForm控件
三色交替的下拉列表框
精通ASP.NET中弹出窗口技术
ASP.NET Forums与现有系统整合方案示例
ASP.NET操作IIS中的虚拟目录
DataGrid与SQL Server 2000数据绑定
如何让Web应用程序在Client端实现导出报表功能
如何保证web app中的Send Email线程稳定性
关于用ASP.Net识别远程主机服务器种类
ASP.NET中上传下载文件
提高ASP.NET性能的方法
asp.net StreamReader 创建文件
asp.net如何生成图片验证码(简单)
一个.net 压缩位图至JPEG的代码
简单的SQL Server数据库数据读取与数据操作
获取网站的RSS聚合到自己的网页
.Net程序中整站通用的防SQL注入函数
asp.net生成缩略图及给原始图加水印的函数

ASP.NET 中的 如何用.NET技术在线生成网站LOGO


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 185 ::
收藏到网摘: n/a

也许大家一看标题就知道,又是老生常谈了,在线生成LOGO其实就是在线生成图片,原理听起来很简单:

1. new一个bitmap或类似之物;

2. 用一个graphic在上边画出你想要的东西;

3. 保存,显示出来,大功告成。

今天要说的是生成中的一些细节问题。没有真正做过,你可能永远也不知道有这样的问题。下边提到的问题和代码,希望对各位有所帮助。

本文的示例程序在http://www.ladysolution.cn/logo.aspx

一。 字体位置。

用不同的字体,如果通过计算字体高度来给字体定位是不精确的,不同的字体有不同的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;

使用这种方法,画出来的图会比只用GDI+画出来更漂亮些,颜色更准确些。