注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Dotnet >> .NET FRAMEWORK >> Dotnet正文

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

文章来源:中国IT实验室收集整理 作者:佚名 更新时间:2008-1-16 19:23:45 【 】 【加入收藏

  也许大家一看标题就知道,又是老生常谈了,在线生成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+画出来更漂亮些,颜色更准确些

  • 上一篇Dotnet:

  • 下一篇Dotnet: 没有了
  • 最 新 热 门
     VBScript常用函数总结
     如何用.NET技术在线生成网站LOGO
     VB2005中开发新一代控制台应用程序(3)
     VB2005中开发新一代控制台应用程序(2)
     VB2005中开发新一代控制台应用程序(1)
     ASP.net服务器控件的优化选择
     小心使用放在App_Code中类的静态成员
     ASP教程:制作登陆验证页面程序
     IIS的安装和配置全过程
     正则表达式中的实用命名组替换
    最 新 推 荐
     如何用.NET技术在线生成网站LOGO
     Domain Model的三种类型及其级别
     QTP调用自己开发的.net类库
     .net中Windows窗体间的数据交互(一)
     .NET开发人员犯的6大安全错误
     在.NET中利用委托实现窗体间通信
     .net页面间的参数传递简单实例
     Silverlight插件安装说明
     Silverlight开发前准备工作
     使用ConfigurationSettings读取配置
    相 关 文 章

    如何编写通用的ASP防SQL注入攻击程序
    如何用ASp实现去掉三个最高分和三个最低分
    ASP如何读取XML数据文件?有什么方法?
    技巧:ASP如何跳出本次进入下一次循环
    网页开发如何使用HTTPS
    ASP教程:ADO存取数据库时如何分页显示
    如何在ASP程序中使用Telnet协议
    如何用ASP生成XML数据文档(RSS订阅)
    ASP技巧:网站的防盗链系统是如何做的?
    黑客教程之如何变成ASP木马高手

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用