简体   繁体   中英

Reduce bitmap image physical size?

I am loading images onto an excel page, once done this excel is around 48,284 KB This is to large and affects the download speed and is not efficient to what we are trying to achieve.

I am trying to reduce this Excel file size as much as possible and think that reducing the image sizes would do the trick as the excel file without images is around 1000 kb.

This is what i have tried so far with no affect:

public Image ReduceImageSize(Image img)
{
     float iwidth = 150;
     float iheight = 150;
     var brush = new SolidBrush(Color.Black);

     var Resizedimage = new Bitmap(img);

     float scale = Math.Min(iwidth / Resizedimage.Width, iheight / Resizedimage.Height);

     var graph = Graphics.FromImage(Resizedimage);

     graph.InterpolationMode = InterpolationMode.Low;
     graph.CompositingQuality = CompositingQuality.Default;
     graph.SmoothingMode = SmoothingMode.None;

     var scaleWidth = (int)(Resizedimage.Width * scale);
     var scaleHeight = (int)(Resizedimage.Height * scale);

     graph.FillRectangle(brush, new RectangleF(0, 0, iwidth, iheight));
     graph.DrawImage(Resizedimage, new Rectangle(((int)iwidth - scaleWidth) / 2, ((int)iheight - scaleHeight) / 2, scaleWidth, scaleHeight));

     return Resizedimage;
}

At this point i'm looking for any way to reduce the size if it involves losing some quality or reducing the images dimensions.

Please help.

You made Resizedimage the same size as img.

Use the following code to fix the result image size:

var Resizedimage = new Bitmap(iwidth,iheight);

An example resizing an image keeping the aspect ratio:

            Image img = Image.FromFile(@"c:\temp\1.jpg");
        Bitmap resizedImg = new Bitmap(150, 150);

        double ratioX = (double)resizedImg.Width / (double)img.Width;
        double ratioY = (double)resizedImg.Height / (double)img.Height;
        double ratio = ratioX < ratioY ? ratioX : ratioY;

        int newHeight = Convert.ToInt32(img.Height * ratio);
        int newWidth = Convert.ToInt32(img.Width * ratio);

        using (Graphics g = Graphics.FromImage(resizedImg))
        {
            g.DrawImage(img, 0, 0, newWidth, newHeight);
        }
        resizedImg.Save(@"c:\temp\2.jpg");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM