Thứ Ba, 3 tháng 5, 2011

// // Leave a Comment

Resize an image - Thay đổi kích thước ảnh C#

Đoạn snippet dưới đây cho phép thay đổi kích thước của 1 bức ảnh. Kích thước mới do người dùng tùy chọn nhập vào.
public Image resizeImage(Image img, int width, int height)
{
    Bitmap b = new Bitmap( width, height ) ;
    Graphics g = Graphics.FromImage( (Image ) b ) ;
   
    g.DrawImage( img, 0, 0, width, height ) ;
    g.Dispose() ;
   
    return (Image ) b ;
}
Hoặc đơn giản chỉ cần nhập vào tỷ lệ phần trăm kích thước của ảnh mới so với ảnh ban đầu cần thay đổi. Để ảnh còn lại 70% thì ta cần nhập vào con số 0.7F
public Image Resize(Image img, float percentage)
{
    //lấy kích thước ban đầu của bức ảnh
    int originalW = img.Width;
    int originalH = img.Height;

    //tính kích thước cho ảnh mới theo tỷ lệ đưa vào
    int resizedW = (int)(originalW * percentage);
    int resizedH = (int)(originalH * percentage);

    //tạo 1 ảnh Bitmap mới theo kích thước trên
    Bitmap bmp = new Bitmap(resizedW, resizedH);
    //tạo 1 graphic mới từ Bitmap
    Graphics graphic = Graphics.FromImage((Image)bmp);
    //vẽ lại ảnh ban đầu lên bmp theo kích thước mới
    graphic.DrawImage(img, 0, 0, resizedW, resizedH);
    //giải phóng tài nguyên mà graphic đang giữ
    graphic.Dispose();
    //return the image
    return (Image)bmp;
}

Ví dụ: Muốn giảm 1 nửa kích thước của ảnh "abc.jpg" ta làm như sau:
            var ifirst = Image.FromFile("abc.jpg");
            var iresize = Resize(ifirst, 0.5F);
            iresize.Save("a.jpg");

Để tùy biến chất lượng ảnh, lớp đồ họa Graphics có chứa 1 số các mode InterpolationMode enum. Các mode này sử dụng để chỉ ra thuật toán nào được sử dụng.
Các thuật toán (được xây dựng trong .NET):
Bicubic
Bilinear
Default
High
HighQualityBicubic
HighQualityBilinear
Invalid
Low
NearestNeighbor

Theo ví dụ 1 ở trên ta chỉnh sửa lại như sau để chỉ ra thuật toán nào nên được sử dụng:
public Image resizeImage( Image img, int width, int height )
{
    Bitmap b = new Bitmap( width, height ) ;
    Graphics g = Graphics.FromImage( (Image ) b ) ;
   
    g.InterpolationMode = InterpolationMode.Bicubic ;    // Specify here
    g.DrawImage( img, 0, 0, width, height ) ;
    g.Dispose() ;
   
    return (Image ) b ;
}

0 comments: