水印的基本製作方法就是使用gdi+的方法在的制定位置上繪製文字或者。
說到gdi+,一般用於winform對於gui的繪製,例如文字編輯器的製作,就是使用gdi函式繪製文字在窗體表面。其實gdi不僅可以繪製窗體,它可以繪製一切的drawable的表面。
我記錄的水印製作就是利用gdi函式,進行原圖和水印的合併,或者在原圖上繪製文字。
關鍵gdi函式:(system.drawing.graphics 類的方法)
drawimage 繪製
drawstring 繪製文字
這兩個函式有大量的過載,具體請查閱msdn。
水印:水印一般是使用純綠或者純藍背景色的,就和拍攝電影一樣,在拍攝的時候,演員在綠色背景裡面演戲,在後期製作的時候,綠色的背景都會被透明色所取代掉。在c#裡面,我們使用setremaptable這個影象特性來完成這個工作。它的作用是讓上面某個顏色被另一種顏色所替換掉。oldcolor 就是要被取代掉的顏色,newcolor則是新的顏色。5-10行則是完成這樣的操作。
接下來就是將的所有點的透明度下降為原來的30%。這裡將使用colormatrix來做。矩陣,在很多地方被大量使用,特別是變換的地方,例如的拉伸,縮放等等,都是利用了矩陣乘法的快速運算。這裡也使用了矩陣來進行全畫素的高速變換。仔細觀察12行的矩陣的對角線上的數字:1,1,1,0.3,1 這些是倍數運算因子。對應則rgbaw的變換倍數。rgb不變,透明度為原來的0.3倍。w也不變。通過這種方法,就將的透明度降低了。
這些顏色變換,在draw方法執行時候,才進行變換。
1 private static imageattributes getimageattributes() ;
9 10 imgattr.setremaptable( remaptable, coloradjusttype.bitmap );
11 12 float colormatrixelements = ,
14 new float ,
15 new float ,
16 new float ,
17 new float
18 };
19 20 colormatrix wmcolormatrix = new colormatrix( colormatrixelements );
21 imgattr.setcolormatrix( wmcolormatrix, colormatrixflag.default, coloradjusttype.bitmap );
22 23 return imgattr;
24 }
水印繪製的地方,也沒有必要貼全部**了
1 imageattributes imgattr = getimageattributes();
2 rectangle rect = getpicpoint( src, wm, wp );
3 4 g.drawimage( wm, rect, 0, 0, wm.width, wm.height, graphicsunit.pixel, imgattr );
第一行,取得剛才那個變換規則
第二行,取得繪製水印的矩形:我們可以指定水印的位置,比如左上角,右下角等等。通過位置的指定,獲得不同的繪製區域的矩形。不過,getpicpoint 這個方法名稱不好,讓人誤以為返回乙個point物件,其實是乙個矩陣物件。建議換為getpicposition或者getpicrect
第三行就是繪製,在指定地方,使用指定顏色變換,繪製指定。
繪製水印文字就相當簡單了,使用乙個透明的筆刷在上繪製水印即可。
fontandsize fs = fontandsize.getvalue( g, words, "arial", fontsize, src.width );
pointf p = gettextpoint( src, fs.size, wp );
stringformat sf = getstringformat();
drawtext( g, words, fs.font, p, sf );
當然,這裡我記錄用了兩種顏色繪製出文字,達到具有陰影效果文字特效。可以看出作者非常用心在開發我記錄啊。。。。
1 private static void drawtext( graphics g, string wmtext, font font, pointf p, stringformat format )
當然,**裡面的注釋太少了,可能是非核心類,所以沒有注釋。當然,我們會在以後逐漸把注釋補足的。作為乙個服務大眾的專案,注釋是不能缺少的,讓每個人看得懂的**,是我們的目標。
驗證碼的製作在 wojiludrawin**alidationcode.cs
驗證碼的製作可以分為3個步驟
1.繪製乙個帶有噪點的背景
2.繪製驗證碼
3.最上層再繪製一些噪點
1 public image createimage( string code, int width, int height, string fontfamily ) {
2 3 bitmap bm = new bitmap( width, height );
4 5 using (graphics g = graphics.fromimage( bm )) {
6 7 g.smoothingmode = smoothingmode.antialias;
8 9 hatchbrush brush = new hatchbrush( hatchstyle.smallconfetti, color.lightgray, color.white );
10 rectangle rect = new rectangle( 0, 0, width, height );
11 g.fillrectangle( brush, rect );
12 13 int fontsize = rect.height + 1;
14 fontandsize size = fontandsize.getvalue( g, code, fontfamily, fontsize, bm.width );
15 16 &nbs
驗證碼的作用和實現原理
防止機器惡意註冊.2 一般註冊使用者id的地方以及各大論壇都要要輸入驗證碼 3 常見的驗證碼 1,四位數字,隨機的一數字字串,最原始的驗證碼,驗證作用幾乎為零。2,csdn 使用者登入用的是gif格式,目前常用的隨機數字驗證碼。上的字元比較中規中矩,驗證作用比上乙個好。沒有基本圖形影象學知識的人,不...
用C 生成中文漢字驗證碼的基本原理
1 漢字編碼原理 到底怎麼辦到隨機生成漢字的呢?漢字從 來的呢?是不是有個後台資料表,其中存放了所需要的所有漢字,使用程式隨機取出幾個漢字組合就行了呢?使用後台資料庫先將所有漢字存起來使用時隨機取出,這也是一種辦法,但是中文漢字有這麼多,怎麼來製作呢?其實可以不使用任何後台資料庫,使用程式就能做到這...
用C 生成中文漢字驗證碼的基本原理 C 應用
1 漢字編碼原理 到底怎麼辦到隨機生成漢字的呢?漢字從 來的呢?是不是有個後台資料表,其中存放了所需要的所有漢字,使用程式隨機取出幾個漢字組合就行了呢?使用後台資料庫先將所有漢字存起來使用時隨機取出,這也是一種辦法,但是中文漢字有這麼多,怎麼來製作呢?其實可以不使用任何後台資料庫,使用程式就能做到這...