C#实现图片压缩
来源:互联网 发布:淘宝windows 编辑:程序博客网 时间:2024/05/21 10:42
using System;using System.Collections.Generic;using System.Linq;using System.Windows.Forms;using System.Drawing;using System.Drawing.Imaging;namespace CScreen{ public class PhotoReduce { public Bitmap ystp(int int_Width, int int_Height, Image image) //压缩图片 { System.Drawing.Image oldimage = new System.Drawing.Bitmap(image); float New_Width; // 新的宽度 float New_Height; // 新的高度 float Old_Width, Old_Height; //原始高宽 int flat = 0;//标记图片是不是等比 int xPoint = 0;//若果要补白边的话,原图像所在的x,y坐标。 int yPoint = 0; //判断图片 Old_Width = (float)oldimage.Width; Old_Height = (float)oldimage.Height; if ((Old_Width / Old_Height) > ((float)int_Width / (float)int_Height)) //当图片太宽的时候 { New_Height = Old_Height * ((float)int_Width / (float)Old_Width); New_Width = (float)int_Width; //此时x坐标不用修改 yPoint = (int)(((float)int_Height - New_Height) / 2); flat = 1; } else if ((oldimage.Width / oldimage.Height) == ((float)int_Width / (float)int_Height)) { New_Width = int_Width; New_Height = int_Height; } else { New_Width = (int)oldimage.Width * ((float)int_Height / (float)oldimage.Height);//太高的时候 New_Height = int_Height; //此时y坐标不用修改 xPoint = (int)(((float)int_Width - New_Width) / 2); flat = 1; } // ===缩小图片=== System.Drawing.Image thumbnailImage = oldimage.GetThumbnailImage((int)New_Width, (int)New_Height, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero); Bitmap bm = new Bitmap(thumbnailImage); if (flat != 0) { Bitmap bmOutput = new Bitmap(int_Width, int_Height); Graphics gc = Graphics.FromImage(bmOutput); SolidBrush tbBg = new SolidBrush(Color.White); gc.FillRectangle(tbBg, 0, 0, int_Width, int_Height); //填充为白色 gc.DrawImage(bm, xPoint, yPoint, (int)New_Width, (int)New_Height); Bitmap bmp = new Bitmap(bmOutput); //ImageCoderInfo ImageCodecInfo ici = null; //Encoder Encoder ecd = null; //EncoderParameter EncoderParameter ept = null; //EncoderParameters EncoderParameters eptS = null; try { //bmp = new Bitmap(filePath); ici = this.getImageCoderInfo("image/jpeg"); ecd = Encoder.Quality; eptS = new EncoderParameters(1); ept = new EncoderParameter(ecd, 10L); eptS.Param[0] = ept; //bmp.Save(filePath_ystp, ici, eptS); } catch (Exception ex) { throw new Exception(ex.Message); } finally { bmp.Dispose(); ept.Dispose(); eptS.Dispose(); } } else { //ImageCoderInfo ImageCodecInfo ici = null; //Encoder Encoder ecd = null; //EncoderParameter EncoderParameter ept = null; //EncoderParameters EncoderParameters eptS = null; try { //bmp = new Bitmap(filePath); ici = this.getImageCoderInfo("image/jpeg"); ecd = Encoder.Quality; eptS = new EncoderParameters(1); ept = new EncoderParameter(ecd, 10L); eptS.Param[0] = ept; // bm.Save(filePath_ystp, ici, eptS); } catch (Exception ex) { throw new Exception(ex.Message); } finally { bm.Dispose(); ept.Dispose(); eptS.Dispose(); } } return bm; } private bool ThumbnailCallback() { return false; } private ImageCodecInfo getImageCoderInfo(string coderType)// 获取图片编码类型信息 { ImageCodecInfo[] iciS = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo retIci = null; foreach (ImageCodecInfo ici in iciS) { if (ici.MimeType.Equals(coderType)) retIci = ici; } return retIci; } }}