zoukankan      html  css  js  c++  java
  • 图像处理模式

      1 /// <summary> 图像处理模式
      2 /// </summary>
      3 public enum ImageSizeMode
      4 {
      5 /// <summary> 原图,不做其他处理
      6 /// </summary>
      7 [CustomAttribute.Custom("原图", "N")]
      8 None,
      9 
     10 /// <summary> 居中 固定中心 剪裁或者留黑
     11 /// </summary>
     12 [CustomAttribute.Custom("居中", "C")]
     13 Center,
     14 
     15 /// <summary> 拉伸 变形 铺满
     16 /// </summary>
     17 [CustomAttribute.Custom("拉伸", "S")]
     18 Stretch,
     19 
     20 /// <summary> 适应 保持比率 留黑边
     21 /// </summary>
     22 [CustomAttribute.Custom("适应", "A")]
     23 Adaptive,
     24 
     25 /// <summary> 填充 保持比率 剪裁多余部分
     26 /// </summary>
     27 [CustomAttribute.Custom("填充", "F")]
     28 Fill
     29 }
     30 
     31 /// <summary> 图像缓存
     32 /// </summary>
     33 public class ImageCache
     34 {
     35 /// <summary> 文件路径
     36 /// </summary>
     37 public string FullName { get; set; }
     38 
     39 /// <summary> 数据
     40 /// </summary>
     41 public byte[] Data { get; set; }
     42 
     43 /// <summary> 最后访问时间
     44 /// </summary>
     45 public DateTime LastTime { get; set; }
     46 }
     47 
     48 /// <summary> 图片资源库
     49 /// </summary>
     50 public class ImageResources
     51 {
     52 public static ImageResources Current
     53 {
     54 get { return _current; }
     55 }
     56 
     57 public ImageResources()
     58 {
     59 _path = Application.StartupPath + "\\";
     60 CacheList = new Dictionary<string, ImageCache>();
     61 }
     62 
     63 ImageDraw draw = new ImageDraw();
     64 
     65 private string _path;
     66 private static readonly ImageResources _current = new ImageResources();
     67 
     68 /// <summary> 图片存放路径 \ 结尾
     69 /// </summary>
     70 public string Path
     71 {
     72 get { return _path; }
     73 set
     74 {
     75 _path = value.TrimEnd('/').TrimEnd('\\') + "\\";
     76 if (!Directory.Exists(_path))
     77 {
     78 Directory.CreateDirectory(_path);
     79 }
     80 }
     81 }
     82 
     83 /// <summary> 缓存尺寸 MB 默认 1024
     84 /// </summary>
     85 public int CacheSize { get; set; }
     86 
     87 /// <summary> 缓存 Key = Path Value.Key = 最后访问时间. Value.Value = 数据
     88 /// </summary> 
     89 public Dictionary<string, ImageCache> CacheList { get; set; }
     90 
     91 /// <summary> 通过网络路径添加图像
     92 /// </summary>
     93 /// <param name="name"></param>
     94 /// <param name="src"></param>
     95 public void AddImageBySrc(string name, string src)
     96 {
     97 var wr = WebRequest.Create(src) as WebRequest;
     98 
     99 var rs = wr.GetResponse().GetResponseStream();
    100 var im = Image.FromStream(rs);
    101 
    102 im.Save(Path + name);
    103 }
    104 
    105 /// <summary> 添加图像
    106 /// </summary>
    107 /// <param name="name"></param>
    108 /// <param name="data"> </param>
    109 public void AddImage(string name, byte[] data)
    110 {
    111 lock (Path)
    112 {
    113 File.WriteAllBytes(Path + name, data);
    114 }
    115 }
    116 
    117 /// <summary> 添加图像
    118 /// </summary>
    119 /// <param name="name"></param>
    120 /// <param name="data"></param>
    121 public void AddImage(string name, HttpPostedFileBase data)
    122 {
    123 lock (Path)
    124 {
    125 data.SaveAs(Path + name);
    126 }
    127 }
    128 
    129 /// <summary> 获取图像
    130 /// </summary>
    131 /// <param name="param"></param>
    132 /// <returns></returns>
    133 public byte[] GetImageByParam(string param)
    134 {
    135 var ii = param.FromJsone<ImageInfo>();
    136 
    137 var bs = Current.GetImage(ii.N, new Size(ii.W, ii.H), ii.M.As(ImageSizeMode.None), ii.Q);
    138 
    139 return bs;
    140 }
    141 
    142 /// <summary> 获取图像
    143 /// </summary>
    144 /// <param name="name"></param>
    145 /// <param name="size"></param>
    146 /// <param name="quality"> </param>
    147 /// <param name="sizeModule"> </param>
    148 public byte[] GetImage(string name, Size? size = null, ImageSizeMode sizeModule = ImageSizeMode.None, int quality = 90)
    149 {
    150 if (name.IsNullOrEmpty())
    151 {
    152 name = "Null.jpg";
    153 }
    154 
    155 string fn;
    156 var isReturnSource = (size == null || sizeModule == ImageSizeMode.None);
    157 
    158 if (isReturnSource)
    159 {
    160 fn = Path + name;
    161 }
    162 else
    163 {
    164 fn = Path + sizeModule.Value() + "_" + quality + "_" + size.Value.Width + "," + size.Value.Height + "/"
    165 + name + ".jpg";
    166 }
    167 
    168 var value = CacheList.TryGet(fn, () =>
    169 {
    170 try
    171 {
    172 lock (this)
    173 {
    174 byte[] data;
    175 if (File.Exists(fn))
    176 {
    177 //缓存文件存在,直接返回
    178 data = File.ReadAllBytes(fn);
    179 }
    180 else
    181 {
    182 // ReSharper disable PossibleInvalidOperationException
    183 if (!File.Exists(Path + name))
    184 {
    185 //图片丢失 
    186 name = "NoFind.jpg";
    187 if (!File.Exists(Path + name))
    188 {
    189 //NoFind.jpg 也不存在.
    190 return null;
    191 }
    192 }
    193 
    194 if (isReturnSource)
    195 {
    196 //返回源图
    197 return new ImageCache { Data = File.ReadAllBytes(Path + name) };
    198 }
    199 
    200 var img = Image.FromFile(Path + name);
    201 var di = img;
    202 switch (sizeModule)
    203 //生成图片
    204 {
    205 case ImageSizeMode.Adaptive:
    206 img = draw.GetAdaptiveImage(img, size.Value);
    207 break;
    208 case ImageSizeMode.Fill:
    209 img = draw.GetFillImage(img, size.Value);
    210 break;
    211 case ImageSizeMode.Stretch:
    212 img = draw.GetStretchImage(img, size.Value);
    213 break;
    214 default:
    215 //没时间写.
    216 throw new Exception("未知的图像处理方式!");
    217 }
    218 
    219 di.Dispose();
    220 
    221 draw.SaveImageToJpeg(img, fn, quality);
    222 
    223 data = GetImage(name, size, sizeModule, quality);
    224 }
    225 return new ImageCache { Data = data };
    226 }
    227 }
    228 catch (Exception ex)
    229 {
    230 if (Query.Ip.IsIn("::1", "127.0.0.1"))
    231 {
    232 throw (ex.Message).ToException();
    233 }
    234 return null;
    235 }
    236 });
    237 
    238 value.IsNotNull(j => j.LastTime = DateTime.Now);
    239 return value.NotNull(j => j.Data);
    240 }
    241 
    242 /// <summary> 图像信息 用于 ToJsone
    243 /// </summary>
    244 private class ImageInfo
    245 {
    246 /// <summary> mode
    247 /// </summary>
    248 public string M { get; set; }
    249 
    250 /// <summary> width
    251 /// </summary>
    252 public int W { get; set; }
    253 
    254 /// <summary> height
    255 /// </summary>
    256 public int H { get; set; }
    257 
    258 /// <summary> name 
    259 /// </summary>
    260 public string N { get; set; }
    261 
    262 /// <summary> Quality
    263 /// </summary>
    264 public int Q { get; set; }
    265 }
    266 
    267 /// <summary> 获取文件参数
    268 /// </summary>
    269 /// <returns></returns>
    270 public string GetImageParam(string name, ImageSizeMode mode = ImageSizeMode.None, int width = 0, int height = 0, int quality = 90)
    271 {
    272 var ii = new ImageInfo { N = name, M = mode.As(""), H = height, W = width, Q = quality };
    273 
    274 return ii.ToJsone();
    275 }
    276 
    277 /// <summary> 获取ImageUrl
    278 /// </summary>
    279 /// <param name="name"></param>
    280 /// <param name="mode"></param>
    281 /// <param name="width"></param>
    282 /// <param name="height"></param>
    283 /// <returns></returns>
    284 public string GetImageUrl(string name, ImageSizeMode mode = ImageSizeMode.None, int width = 0, int height = 0, int quality = 90)
    285 {
    286 return "/Image/" + GetImageParam(name, mode, width, height, quality);
    287 }
    288 
    289 /// <summary> 清理缩略图文件缓存
    290 /// </summary>
    291 public void ClearFileCache()
    292 {
    293 var ps = Directory.GetDirectories(Path);
    294 
    295 foreach (var s in ps)
    296 {
    297 try
    298 {
    299 Directory.Delete(s, true);
    300 }
    301 catch
    302 { }
    303 }
    304 }
    305 }
    306 }
  • 相关阅读:
    [mysql] update……from……
    [python]接口签名
    [同步脚本]mysql-elasticsearch同步
    什么是Java Marker Interface(标记接口)
    input type="submit" 和"button"有什么区别
    发现个工具,查询Mongo数据使用mysql语法
    红黑树和AVL树(平衡二叉树)区别
    C# 字符串转义和反转义
    MySQL变量的使用
    HTML <form> 标签
  • 原文地址:https://www.cnblogs.com/creater/p/6322053.html
Copyright © 2011-2022 走看看