相信逛過淘寶的都知道,同一張圖片,展現在不一樣的地方,尺寸是不一樣的,若是強制對原圖進行拉伸,有可能會變形,影響視覺效果,在這種狀況下,對同一張圖片,根據須要,生成不一樣的縮略圖,須要的時候再調用,就能夠很好的解決這一問題。下面經過一個實例來詳細的說明一下這種狀況:瀏覽器
下圖是百度圖片廣場的列表頁:ide
列表頁 圖-1 學習
經過Chrome瀏覽器,咱們能夠看到,在這裏這張圖片所佔的大小爲188px X 188px(列表頁 圖-2),也就是此時只須要188px X 188px大小的圖片就足夠了,若是將原圖500px X 500px的圖片強制壓縮放在這裏,是能夠展現出來,可是加載的倒是原來的大圖,對於用戶的流量來講,這就浪費了很大一部分,若是網速不給力的話,加載也會很是的慢。當咱們點擊這張圖片的時候,會進入二級列表頁,這裏的尺寸又會不同(二級列表 圖-3),當咱們再點進去以後就會到詳細頁面,這裏展現的又是另一個尺寸(詳細頁 圖-4)。spa
列表頁 圖-23d
二級列表 圖-3code
詳細頁 圖-4orm
稍微細心一點你也能夠發現,每張圖片顯示的都很合適,沒有明顯的拉伸或者壓縮的現象,這就用到了咱們今天所說的縮略圖。固然,這只是做者本身作的一個小Demo,裏邊確定會有不少不足的地方,也會有不少考慮不周的地方,若是願意分享一下您瀏覽以後的感想,十分感謝。blog
先說一下大體的思路:首先選定一個文件夾,找出裏邊全部的圖片文件,而後再根據須要生成縮略圖的尺寸和生成縮略圖的模式,生成縮略圖文件,而後保存到指定的路徑下。這裏須要說明一下的就是生成縮略圖的模式,既然是縮略圖,確定和原圖的尺寸不同,根據不一樣的模式,裁剪的方式也不同。本文中共提出了5中縮略圖,實際中您能夠根據本身的狀況,增長鬚要或者刪除不須要的縮略圖模式。如下是五種生成縮略圖的模式:圖片
一、自動縮放:若是須要生成縮略圖的寬度比高度大,那麼效果跟第二種模式產生的效果同樣;若是寬度比高度小,則效果跟第三種模式產生的效果同樣。get
二、指定寬高按比例:這種模式下,寬度即爲須要生成的圖片寬度,高度爲須要生成的縮略圖的寬度與原圖寬度的比再乘以須要生成的縮略圖的高度。
三、指定高寬按比例:這種模式證號和第二種模式相反,高度必定,寬度乘以比值。
四、指定高寬縮放:按照指定的尺寸生成縮略圖。
五、指定高寬裁剪:指定高,把兩邊的寬裁剪掉。
這裏示例就採用傳統的WebForm的方式來作演示,也能夠用MVC來實現。這裏新建了一個WebApplication項目,如圖-5,裏邊包含一個頁面展現頁面,一個縮略圖模式的枚舉,一個生成縮略圖的Handler,一個JQuery腳本(用來提交數據)。這裏值得注意的就是,Handler須要在WebConfig裏作配置,才能生效。還有一點就是,會默認調用Handler裏的ProcessRequest方法,只須要將生成縮略圖的代碼放到這個Request方法裏就能夠了。
圖-5
因爲僅僅只是作演示,因此這裏忽略掉了樣式,元素只是簡單地疊加,並無美化。開始界面如圖-6:
圖-6
如下是定義的枚舉:
public enum MakeThumbnailMode { Auto,//自動裁剪模式 W,//指定寬,高按比例 H, //指定高,寬按比例 HW,//指定高,寬縮放 Cut//指定寬,高裁剪 }
如下部分是生成縮略圖的兩個關鍵方法:
static Bitmap getThumBitmap(Image originalImage, int width, int height, MakeThumbnailMode mode, out Graphics graphics) { Bitmap bitmap; int thumbWidth = width; int thumbHeight = height; int x = 0; int y = 0; int originalWidth = originalImage.Width; int originalHeight = originalImage.Height; if (mode == MakeThumbnailMode.Auto) { if (thumbWidth > thumbHeight) { mode = MakeThumbnailMode.W; } else { mode = MakeThumbnailMode.H; } } if (originalHeight < thumbHeight && originalWidth < thumbWidth) { thumbWidth = originalWidth; thumbHeight = originalHeight; } switch (mode) { case MakeThumbnailMode.W: thumbHeight = originalHeight * width / originalWidth; break; case MakeThumbnailMode.H: thumbWidth = originalWidth * height / originalHeight; break; case MakeThumbnailMode.HW: break; case MakeThumbnailMode.Cut: if ((double)originalWidth / (double)originalHeight>(double)width / (double)height) { originalHeight = originalImage.Height; originalWidth = width * originalHeight / height; y = 0; x = (originalWidth - width) / 2; } else { originalWidth = originalImage.Width; originalHeight = height * originalWidth / width; x = 0; y = (originalHeight - height) / 2; } break; } bitmap = new Bitmap(thumbWidth, thumbHeight); bitmap.MakeTransparent(Color.Transparent); graphics = Graphics.FromImage(bitmap); graphics.Clear(Color.Transparent); graphics.DrawImage(originalImage, new Rectangle(0, 0, thumbWidth, thumbHeight), new Rectangle(x, y, originalWidth, originalHeight), GraphicsUnit.Pixel); return bitmap; }
static void MakeThumbPic(string originalImagePath, string thumbnailPath, int width, int height, MakeThumbnailMode mode, ImageFormat imageFormat) { using (Image image = Image.FromFile(originalImagePath)) { Graphics graphics; Bitmap bitmap = getThumBitmap(image, width, height, mode, out graphics); try { bitmap.Save(thumbnailPath, imageFormat); } catch (Exception) { throw; } } }
而後在ProcessRequest方法裏調用MakeThumbPic方法,便可生成縮略圖了。因爲代碼都不是太難,因此這裏就給出一個思路,詳細的代碼就不敲了,有須要的能夠發郵箱。經過context上下文獲取到提交過來的數據,而後遍歷圖片文件,得到全部的圖片文件,而後循環,每張圖片都調用生成縮略圖的makeThumbpic方法,便可生成須要的縮略圖了。
如您有任何的建議和見解,歡迎和我聯繫,你們一塊兒學習,一塊兒進步,謝謝!