چگونه عکس را  در #C تغییر سایز دهیم؟
شبکه

چگونه عکس را در #C تغییر سایز دهیم؟


پنج‌شنبه 25 اردیبهشت 1393
10 دقیقه
آنچه در این مقاله میخوانید

    این مقاله راهنمایی است برای تغییر سایز و فرمت تصویر در سی شارپ که به همراه فایل هایی برای دانلود و کمک به کاربران قرار گرفته است.

    هدف از انجام این کار بهینه سازی و زیبا سازی وب سایت میباشد بدون شک شما هم در وب گردی های خود با عکس های بزرگ و حجیم برخرد کرده این که دیر و به تدریج لود شدن آنها باعث میشود.

    تغییر سایز عکس با C# از وب گردی خود لذت نبرید یا عکس هایی که سایز بزرگ آنها ترکیب و نظم سایت را به هم زده اند و باعث سر در گمی شما در سایت میشود در نتیجه احتمال دارد این اتفاق برای کاربر سایت شما هم بیافتد بنا بر این با کوچک کردن سایز عکس سرعت سایت خود را بالا ببرید و ظاهر مناسب و کاربر پسند تری را ارائه کنید.

     این کار به دو روش قابل انجام میباشد

    1-استفاده از HttpHandler

    2-استفاده از کلاس ThumbGenerator

    روش اول:

    پیش نیاز:آشنایی با مفاهیم ابتدایی HttpHandler

     برای استفاده از این روش ابتدا دو کلاس اماده BitmapManipulator و ThumbHandler را به پروژه اضافه میکنیم سپس ThumbHandler را به عنوان HttpHandler در دو قسمت system.web و system.webserver با path="*.thumb" به Web.Config اضافه میکینیم حال پروژه برای استفاده از این هندلر اماده است (کار این هندلر این است که با کمک کلاس BitmapManipulator و Web.Config فرمت عکس را شناسایی کند و آن را تغییر سایز دهد و فرمت آن را .thumb کند و در همان پوشه در کنار عکس بزرگ آن را ذخیره کند).

     حال برای تست یک فدلر به نام images در سلوشن ایجاد میکنیم و تعدادی عکس درون آن میریزیم و در صفحه Default.aspx یا هر صفحه دلخواه یک GridView ایجاد میکنیم و فلدر images را به عنوان دیتا سورس به صورت زیر به آن میدهیم

    protected void Page_Load(object sender, EventArgs e)

            {

                if (!IsPostBack)

                {

                    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/images"));

                    FileInfo[] fi = di.GetFiles("*.jpg");

                    GridView1.DataSource = fi;

                    GridView1.DataBind();

                   

                }

            }

     

    پس سه column از جنس های Boundfield ,Templatefield و ImageField به گرید اضافه میکنیم و در مشخصات Boundfield در قسمت DataField FullName میدهیم سپس به EditTemplate –item Template میرویم و یک کامپونت image داخل آن قرار میدهیم و گزینه EditDataBindings آن را میزنیم و در قسمت Code experession کد زیر را وارد میکنیم

    System.IO.Path.GetFileName(Eval("FullName").ToString()) +".thumb" 

    حال اگر پرژه را اجرا کنید نتیجه مطلوب را خواهید دید.

     اما برای اپلود عکس در این فلدر میبایست کد زیر را به همان قسمت اضافه کنید

     

              if (IsPostBack && FileUpload1.HasFile)

                {

                    Boolean fileOK = false;

                    String path = Server.MapPath("~/images/");

                    if (FileUpload1.HasFile)

                    {

                        String fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();

                        String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };

                        for (int i = 0; i < allowedExtensions.Length; i++)

                        {

                            if (fileExtension == allowedExtensions[i])

                            {

                                fileOK = true;

                            }

                        }

                    }

                    if (FileUpload1.PostedFile.ContentLength>30000)

                    {

                       fileOK = false;

                       

                    }

                    if (fileOK)

                    {

                        try

                        {

                            FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);

                            Label1.Text = "با موفقیت انحام شد";

                           

                        }

                        catch (Exception ex)

                        {

                            Label1.Text = "اپلود انجام نشد لطفا دوباره امتحان کنید";

                        }

                    }

                    else

                    {

                        Label1.Text = " فایل انتخاب شده فرمت عکس ندارد یا حجم آن از 300 کیلو بایت بیشتر میباشد";

                    }

     

     روش دوم: در این روش این کار خیلی ساده تر انجام میگیرد و تنها تفاوت این دو تشخیص فرمت به وسیله هندلر میباشد در این روش کافیست کلاس ThumbGenerator را به پروژه اضافه کنید و درون برنامه ان را فراخوانی کنید این کلاس سه پارامتر دارد که به صورت زیر میتوانیم به آن پاس دهیم

     

    protected void Page_Load(object sender, EventArgs e)

            {

                if (IsPostBack)

                {

                    string strFileName;

                    string path;

                    strFileName = FileUpload1.FileName;

                    path = Server.MapPath("~/Images");

                    if (strFileName != string.Empty)

                    {

                        FileUpload1.PostedFile.SaveAs(path + "/" + strFileName);

                        ThumbGenerator.ResizeImage(150, path + "/" + strFileName, path + "/thumb_" + strFileName);

                    }

                }

            }

     

    توجه داشته باشید که پارامتر اول تعداد پیکسل های خروجی را مشخص میکند در ضمن این کلاس فقط عکس را کوچک میکند و نمایش آن از این طریق ممکن نیست کد های این کلاس: 

     

    public class ThumbGenerator

        {

            public static void ResizeImage(int size, string filePath, string saveFilePath)

            {

                float num3;

                Bitmap original = new Bitmap(filePath);

                if (original.Height > original.Width)

                {

                    num3 = ((float)size) / Convert.ToSingle(original.Height);

                }

                else

                {

                    num3 = ((float)size) / Convert.ToSingle(original.Width);

                }

                if ((num3 < 0f) || (num3 > 1f))

                {

                    num3 = 1f;

                }

                float num = Convert.ToSingle(original.Height) * num3;

                float num2 = Convert.ToSingle(original.Width) * num3;

                Bitmap image = new Bitmap(original, Convert.ToInt32(num2), Convert.ToInt32(num));

                Graphics graphics = Graphics.FromImage(image);

                graphics.SmoothingMode = SmoothingMode.HighQuality;

                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

                graphics.CompositingQuality = CompositingQuality.HighQuality;

                ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders();

                EncoderParameters encoderParams = new EncoderParameters(1);

                encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);

                graphics.DrawImage(original, 0, 0, image.Width, image.Height);

                original.Dispose();

                image.Save(saveFilePath+"a.bmp", imageEncoders[1], encoderParams);

                image.Dispose();

                graphics.Dispose();

            }