[C#] ImageHelper 图片处理

#region GetPicThumbnail
        /// <summary>
        /// 无损压缩图片
        /// </summary>
        /// <param name="sm">文件流</param>
        /// <param name="flag">压缩质量 1-100</param>
        /// <returns></returns>
        public static byte[] GetPicThumbnail(Stream sm, int flag)
        {
            Image iSource = Image.FromStream(sm);
            //获取图片 EXIF信息  如果图片旋转了 在给转回来
            var dic = ReadExif(iSource);
            if (dic.Count > 0 && dic["Orientation"] == "6")
            {
                iSource.RotateFlip(RotateFlipType.Rotate90FlipX);
            }
            ImageFormat tFormat = iSource.RawFormat;
            int sW, sH;
            //按比例缩放
            Size temsize = new Size(iSource.Width, iSource.Height);
            int dWidth = temsize.Width;
            int dHeight = temsize.Height;
            Bitmap ob = new Bitmap(dWidth, dHeight);
            Graphics g = Graphics.FromImage(ob);
            g.Clear(Color.WhiteSmoke);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(iSource, new Rectangle(0, 0, iSource.Width, iSource.Height), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegICIinfo = null;
                for (int x = 0; x < arrayICI.Length; x++)
                {
                    if (arrayICI[x].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                byte[] bytes;
                if (jpegICIinfo != null)
                {
                    MemoryStream ms = new MemoryStream();
                    ob.Save(ms, jpegICIinfo, ep);//dFile是压缩后的新路径
                    bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 这两句都可以,至于区别么,下面有解释
                    ms.Close();
                }
                else
                {
                    MemoryStream ms = new MemoryStream();
                    ob.Save(ms, tFormat);
                    bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 这两句都可以,至于区别么,下面有解释
                    ms.Close();
                }
                return bytes;
            }
            catch
            {
                return null;
            }
            finally
            {
                iSource.Dispose();
                ob.Dispose();
            }
        }
        /// <summary>
        /// 获取图片EXIF信息
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        private static Dictionary<string, string> ReadExif(Image image)
        {
            var exif = new Dictionary<string, string>();
            var properties = image.PropertyItems;
            foreach (var property in properties)
            {
                switch (property.Id)
                {
                    case 0x010E:
                        exif["ImageTitle"] = ASCIIToString(property.Value);
                        break;
                    case 0x010F:
                        exif["Make"] = ASCIIToString(property.Value);
                        break;
                    case 0x0110:
                        exif["Model"] = ASCIIToString(property.Value);
                        break;
                    case 0x0112:
                        exif["Orientation"] = ShortToString(property.Value, 0);
                        break;
                    case 0x011A:
                        exif["XResolution"] = RationalToSingle(property.Value, 0);
                        break;
                    case 0x011B:
                        exif["YResolution"] = RationalToSingle(property.Value, 0);
                        break;
                    case 0x0128:
                        exif["ResolutionUnit"] = ShortToString(property.Value, 0);
                        break;
                    case 0x0131:
                        exif["Software"] = ASCIIToString(property.Value);
                        break;
                    case 0x0132:
                        exif["DateTime"] = ASCIIToString(property.Value);
                        break;
                    //GPS
                    case 0x0002:
                        exif["GPSLatitude"] = string.Format("{0}°{1}′{2}″",
                                                            RationalToSingle(property.Value, 0),
                                                            RationalToSingle(property.Value, 8),
                                                            RationalToSingle(property.Value, 16)
                                                            );
                        break;
                    case 0x0004:
                        exif["GPSLongitude"] = string.Format("{0}°{1}′{2}″",
                                                            RationalToSingle(property.Value, 0),
                                                            RationalToSingle(property.Value, 8),
                                                            RationalToSingle(property.Value, 16)
                                                            );
                        break;
                    case 0x0006:
                        exif["GPSAltitude"] = RationalToSingle(property.Value, 0);
                        break;
                }
            }
            return exif;
        }
        #region tostring方法
        static string ByteToString(byte[] b, int startindex)
        {
            if (startindex + 1 <= b.Length)
                return ((char)b[startindex]).ToString();
            else
                return string.Empty;
        }
        static string ShortToString(byte[] b, int startindex)
        {
            if (startindex + 2 <= b.Length)
                return BitConverter.ToInt16(b, startindex).ToString();
            else
                return string.Empty;
        }
        static string RationalToSingle(byte[] b, int startindex)
        {
            if (startindex + 8 <= b.Length)
                return (BitConverter.ToSingle(b, startindex) / BitConverter.ToSingle(b, startindex + 4)).ToString();
            else
                return string.Empty;
        }
        static string ASCIIToString(byte[] b)
        {
            return Encoding.ASCII.GetString(b);
        }
        #endregion
        #endregion
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容