技術原理解析 2 C 水印和驗證碼的製作

2021-12-30 00:33:35 字數 3323 閱讀 1502

水印的基本製作方法就是使用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 漢字編碼原理 到底怎麼辦到隨機生成漢字的呢?漢字從 來的呢?是不是有個後台資料表,其中存放了所需要的所有漢字,使用程式隨機取出幾個漢字組合就行了呢?使用後台資料庫先將所有漢字存起來使用時隨機取出,這也是一種辦法,但是中文漢字有這麼多,怎麼來製作呢?其實可以不使用任何後台資料庫,使用程式就能做到這...