c#等比例缩放、压缩gif、动图文件

原创 2013年12月06日 10:19:27
 //原图路径
            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


C#中基于GDI+(Graphics)图像处理系列之图片压缩优化

简介笔者刚开始接触计算机时是在学校里,学校的网速你懂的,学校局域网里能有5MB/s,而访问学校以外的网站时能有256KB/s就相当满意了。那时候笔者在开发网站时,处理图片时就特别小心,能用gif的不用...
  • lhtzbj12
  • lhtzbj12
  • 2017年01月06日 21:55
  • 1990

C#图片压缩处理

最近在做相册功能遇到一个问题,就是加载图片的时候然后放大,感觉有点卡。图片可能有点大,所以考虑用缩略图来实现。 也就是在查询出来一个相册图片  ,一页显示几十张,这几十张用缩略图来显示,看相信情况的...
  • qq_16542775
  • qq_16542775
  • 2016年06月30日 17:34
  • 1628

c# 无损高质量压缩图片代码

/// /// 无损压缩图片 /// /// 原图片 /// 压缩后保存位置 /// 高度 ...
  • qq_16542775
  • qq_16542775
  • 2016年06月30日 17:39
  • 10660

C#修改GIF大小同时保持GIF仍然可动和背景透明

一帧的属性复制到了新的对象中,大家如果需要可以直接修改这些属性,比如设置间隔时间可以通过 res.GetPropertyItem(0x5100)这个方法可以得到间隔时间,然后设置得到的属性即可,每一...
  • angel20082008
  • angel20082008
  • 2015年01月22日 20:19
  • 1571

C#更改gif图片大小后仍然保持动画效果

先声明,不是我原创的,我也是借鉴别人的方法。 public Form1() { InitializeComponent(); ...
  • ojlovecd
  • ojlovecd
  • 2012年12月14日 17:30
  • 9526

C#中保存GIF文件后透明背景问题的一个解决方法

  以前在用C#做网站保存缩略图的程序中发现,当保存为GIF文件类型时,原来的透明背景变成了黑色,当时由于赶时间,就统一用白色代替了背景,并用Jpeg格式存储,并没有深究。  近来在网上查阅了许多资料...
  • ncjmc
  • ncjmc
  • 2006年08月28日 15:58
  • 2857

完美实现GIF动画缩略图(GIF压缩使用C++、shell命令、php)

http://blog.csdn.net/czloveyeer/article/details/8179220 缩略图是个很常用的功能。它的实现并不复杂,但如果原图是GIF动画的话,问题就会...
  • sd19871122
  • sd19871122
  • 2016年03月02日 23:55
  • 992

Java工具类——实现gif图片缩放与剪切功能

比较实用, 可以处理gif动态图片 Java图片处理工具类: [java] view plain copy   package com.pink...
  • xyw591238
  • xyw591238
  • 2016年06月20日 12:59
  • 1121

WinForm里加载GIF图片

private void DisplayGIF() { Bitmap adimatedGif = new Bitmap(@"C:\gif\2.gif");// ...
  • ja38911
  • ja38911
  • 2013年12月17日 12:36
  • 2824

C#修改GIF大小同时保持GIF仍然可动和背景透明

一帧的属性复制到了新的对象中,大家如果需要可以直接修改这些属性,比如设置间隔时间可以通过 res.GetPropertyItem(0x5100)这个方法可以得到间隔时间,然后设置得到的属性即可,每一...
  • angel20082008
  • angel20082008
  • 2015年01月22日 20:19
  • 1571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#等比例缩放、压缩gif、动图文件
举报原因:
原因补充:

(最多只允许输入30个字)