如何用.NET技術在線生成網站LOGO

也許大家一看標題就知道,又是老生常談了,在線生成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;

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章