Fix hình ảnh tự động

by degiocuondi.com 18. May 2011 06:49

Khi thiết kế web, ta thường phải tạo hình thumbnail cho sản phẩm, tin tức, ... làm cho web load nhẹ hơn, thay vì resize hình bằng cách set width/height vừa với khung hình sẽ hay làm hình bị méo mó vì tỷ lệ width/height của hình khác tỷ lệ width/height của khung.

Có 2 cách tạo thumbnail thông thường:

 + Cách 1: Tạo thumbnail thủ công: mở hình bằng photoshop, crop/resize để có hình thumb.

 + Cách 2: Lập trình để tạo thumb tự động, lợi ích của cách này là

  - Tiết kiệm công sức, thử tượng tượng bạn mệt thế nào khi phải tạo thumbnail cho 1000 sản phẩm bằng các crop/resize bằng photoshop

  - Chỉ cần upload 1 hình gốc, các hình thumbnail sẽ được tự tạo ra thay vì phải upload cả hình gốc và hình thumbnail

  - Có thể tạo nhiều thumbnail với kích thước khác nhau, chỉ việc truyền tham số width/height là có 1 thumbnail.

Bài viết nài tôi xin trình bày cách tạo thumbnail tự động.

 

Hãy xem 3 hình được tạo từ một hình gốc Bar Refaeli

(tự động fix 400x400 - <img src="http://docbao.5s.com.vn/category/autofiximage.axd?picture=2011/5/18/Bong-Da-Day-song-%C4%91am-me-boi-Bar-Refaeli-.jpg&width=400&height=400" />)

(tự động fix 250x400 - <img src="http://docbao.5s.com.vn/category/autofiximage.axd?picture=2011/5/18/Bong-Da-Day-song-%C4%91am-me-boi-Bar-Refaeli-.jpg&width=250&height=400" />)

 

(tự động fix 400x250 - <img src="http://docbao.5s.com.vn/category/autofiximage.axd?picture=2011/5/18/Bong-Da-Day-song-%C4%91am-me-boi-Bar-Refaeli-.jpg&width=400&height=250" />)

Code

//Bước I: tỷ lệ hình gốc
		float oWH = (float)img.Width / (float)img.Height;
		//tỷ lệ khung
		float nWH = (float)width / (float)height;


		//Bước II: nếu tỷ lệ gốc > tỷ lệ khung
                if (oWH > nWH)
                {
                    //resize theo chiều cao
                    int w = Convert.ToInt16((float)(oWH * height));
                    img = Utils.Resize(img, w, height);
                }
		// ngược lại: tỷ lệ gốc <= tỷ lệ khung
                else
                {
                    //resize theo chiều rộng
                    int h = (int)(width / oWH);
                    img = Utils.Resize(img, width, h);
                }
		// ==> sau bước ngày thì:
		// + hoặc chiều rộng hình = chiều rộng  khung
		// + hoặc chiều cao hình = chiều cao khung

                //Bước III: crop theo kích thước khung
		//bỏ đi phần thừa (trên/dưới, hoặc trái/phải)
		//giữ lại phần giữa

                img = Utils.Crop(img, width, height);

Các hàm tham khảo

 

        using Drawing = System.Drawing;     
        using System.Drawing.Drawing2D;

 
	//Resize
        public static Drawing.Image Resize(Drawing.Image img, int width, int height)
        {
            Drawing.Bitmap bmp = new Drawing.Bitmap(width, height);
            Drawing.Graphics graphic = Drawing.Graphics.FromImage((Drawing.Image)bmp);
            graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphic.DrawImage(img, 0, 0, width, height);
            graphic.Dispose();

            return (Drawing.Image)bmp;
        }

	//Crop
        public static Drawing.Image Crop(Drawing.Image img, int width, int height)
        {
            int x = (int)((img.Width - width) / 2);
            if (x < 0)
                x = 0;
            int y = (int)((img.Height - height) / 2);
            if (y < 0)
                y = 0;
            Drawing.Rectangle rect = new Drawing.Rectangle(x, y, width, height);
            Drawing.Bitmap src = new Drawing.Bitmap(img);
            Drawing.Bitmap target = src.Clone(rect, src.PixelFormat);

            src.Dispose();
            img.Dispose();

            return (Drawing.Image)target;
        }
Để gió cuốn đi

Tags: ,

Kinh nghiệm lập trình

Comments are closed

Tài trợ bởi Lạc Tâm. Hosting bởi ProHOST
Powered by BlogEngine.NET 2.5.0.6 - Old School Theme by n3o Web Designers

Menu

Bookmark and Share Log in
 

Tài trợ