程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#等比例縮放、壓縮gif、動圖文件

c#等比例縮放、壓縮gif、動圖文件

編輯:C#入門知識

 //原圖路徑
            string imgPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\0.gif";
            //原圖
            Image img = Image.FromFile(imgPath);
            //不夠100*100的不縮放
            if (img.Width > 100 && img.Height > 100)
            {
                //新圖第一幀
                Image new_img = new Bitmap(100, 100);
                //新圖其他幀
                Image new_imgs = new Bitmap(100, 100);
                //新圖第一幀GDI+繪圖對象
                Graphics g_new_img = Graphics.FromImage(new_img);
                //新圖其他幀GDI+繪圖對象
                Graphics g_new_imgs = Graphics.FromImage(new_imgs);
                //配置新圖第一幀GDI+繪圖對象
                g_new_img.CompositingMode = CompositingMode.SourceCopy;
                g_new_img.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g_new_img.PixelOffsetMode = PixelOffsetMode.HighQuality;
                g_new_img.SmoothingMode = SmoothingMode.HighQuality;
                g_new_img.Clear(Color.FromKnownColor(KnownColor.Transparent));
                //配置其他幀GDI+繪圖對象
                g_new_imgs.CompositingMode = CompositingMode.SourceCopy;
                g_new_imgs.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g_new_imgs.PixelOffsetMode = PixelOffsetMode.HighQuality;
                g_new_imgs.SmoothingMode = SmoothingMode.HighQuality;
                g_new_imgs.Clear(Color.FromKnownColor(KnownColor.Transparent));
                //遍歷維數
                foreach (Guid gid in img.FrameDimensionsList)
                {
                    //因為是縮小GIF文件所以這裡要設置為Time
                    //如果是TIFF這裡要設置為PAGE
                    FrameDimension f = FrameDimension.Time;
                    //獲取總幀數
                    int count = img.GetFrameCount(f);
                    //保存標示參數
                    Encoder encoder = Encoder.SaveFlag;
                    //
                    EncoderParameters ep = null;
                    //圖片編碼、解碼器
                    ImageCodecInfo ici = null;
                    //圖片編碼、解碼器集合
                    ImageCodecInfo[] icis = ImageCodecInfo.GetImageDecoders();
                    //為 圖片編碼、解碼器 對象 賦值
                    foreach (ImageCodecInfo ic in icis)
                    {
                        if (ic.FormatID == ImageFormat.Gif.Guid)
                        {
                            ici = ic;
                            break;
                        }
                    }
                    //每一幀
                    for (int c = 0; c < count; c++)
                    {
                        //選擇由維度和索引指定的幀
                        img.SelectActiveFrame(f, c);
                        //第一幀
                        if (c == 0)
                        {
                            //將原圖第一幀畫給新圖第一幀
                            g_new_img.DrawImage(img, new Rectangle(0, 0, 100, 100), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
                            //把振頻和透明背景調色板等設置復制給新圖第一幀
                            for (int i = 0; i < img.PropertyItems.Length; i++)
                            {
                                new_img.SetPropertyItem(img.PropertyItems[i]);
                            }
                            ep = new EncoderParameters(1);
                            //第一幀需要設置為MultiFrame
                            ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
                            //保存第一幀
                            new_img.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"/temp/" + Path.GetFileName(imgPath), ici, ep);
                        }
                        //其他幀
                        else
                        {
                            //把原圖的其他幀畫給新圖的其他幀
                            g_new_imgs.DrawImage(img, new Rectangle(0, 0, 100, 100), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
                            //把振頻和透明背景調色板等設置復制給新圖第一幀
                            for (int i = 0; i < img.PropertyItems.Length; i++)
                            {
                                new_imgs.SetPropertyItem(img.PropertyItems[i]);
                            }
                            ep = new EncoderParameters(1);
                            //如果是GIF這裡設置為FrameDimensionTime
                            //如果為TIFF則設置為FrameDimensionPage
                            ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionTime);
                            //向新圖添加一幀
                            new_img.SaveAdd(new_imgs, ep);
                        }
                    }
                    ep = new EncoderParameters(1);
                    //關閉多幀文件流
                    ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
                    new_img.SaveAdd(ep);
                }

                //釋放文件
                img.Dispose();
                new_img.Dispose();
                new_imgs.Dispose();
                g_new_img.Dispose();
                g_new_imgs.Dispose();
            }

//效果

\

100*100

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved