zoukankan      html  css  js  c++  java
  • C#——图片操作类简单封装

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Drawing;
    using System.IO;
    using ReligionServer.constant;
    
    namespace ReligionServer.util {
    
        /// <summary>
        /// 图片操作的工具类
        /// </summary>
        public class ImageUtil {
    
            /// <summary>
            /// Base64字符转图片单个存储: 将传入的Base64字符串image解析并转存到指定的target目录下, 返回FileInfo
            /// </summary>
            /// <param name="context"></param>
            /// <param name="image"></param>
            /// <returns></returns>
            public static Model.FileInfo Base64ImageInsert(HttpContext context, String image) {
                return ConvertBase64StringToImageAndInsert(context, image);
            }
    
            /// <summary>
            /// Base64字符转图片批量存储: 将传入的Base64字符串集合imageList解析并转存到指定的target目录下, 返回成功的FileInfo的List集合
            /// </summary>
            /// <param name="imageList"></param>
            /// <param name="targetPath"></param>
            /// <returns></returns>
            public static List<Model.FileInfo> Base64ImageInsertBatch(HttpContext context, List<String> imageList) {
                List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>();
                foreach (String item in imageList) {
                    Model.FileInfo temp = Base64ImageInsert(context, item);
                    if (temp != null) {
                        fileInfoList.Add(temp);
                    }
                }
                return fileInfoList;
            }
    
            /// <summary>
            /// 将传入Base64字符串转换为BitMap并进行转存
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            private static Model.FileInfo ConvertBase64StringToImageAndInsert(HttpContext context, String value) {
                Model.FileInfo fileInfo = ParametersUtil.GetInstanceFormRequest<Model.FileInfo>(context, new Model.FileInfo());//使用ForeignKey初始化FileInfo
                if (!CommonUtil.IsEmpty(fileInfo.ForeignKey)) {
                    MemoryStream memoryStream = null;
                    Bitmap bitmap = null;
                    try {
                        byte[] bytes = Convert.FromBase64String(parseBase64String(value));
                        String value_tmep = parseBase64String(value);
                        memoryStream = new MemoryStream(bytes);
                        bitmap = new Bitmap(memoryStream);
                        if (bitmap != null) {
                            String directory = DateUtil.CurrentDateTimeValue();//转存图片的文件夹
                            String targetPhysicalFilePath = context.Request.PhysicalApplicationPath + UploadConstant.UPLOAD_FILE_PATH + directory;//转存图片文件夹的物理路径
                            if (!Directory.Exists(targetPhysicalFilePath)) {
                                Directory.CreateDirectory(targetPhysicalFilePath);
                            }
                            String targetPath = targetPhysicalFilePath + "/" + CommonUtil.CreateFileName() + SuffixConstant.JPEG;//转存图片的全路径
                                                                                                                                 //填充FileInfo
                            fileInfo.FileCode = CommonUtil.CreateId();
                            fileInfo.Name = CommonUtil.CreateFileName() + SuffixConstant.JPEG;
                            fileInfo.setType(SuffixConstant.JPEG.Substring(1));
                            fileInfo.Desc = parseBase64String(value);
                            fileInfo.Access = 0;//0表示关联, 1表示独立
                            fileInfo.Path = UploadConstant.UPLOAD_FILE_PATH + directory + "/" + CommonUtil.CreateFileName() + SuffixConstant.JPEG;
                            fileInfo.setCreateTime();
                            bitmap.Save(targetPath, System.Drawing.Imaging.ImageFormat.Png);
                            return fileInfo;
                        }
                    } catch (Exception e) {
                        //暂时不做处理
                        System.Diagnostics.Debug.WriteLine(e.Message);
                    } finally {
                        if (null != memoryStream) {
                            //GDI+ 中发生一般性错误, 这个问题一般为输出路径不存在, 或者是对当前输出路径没有权限, 再者就是文件的生命周期问题 这个问题如下所示
                            //在Image的整个操作过程中, memoryStream是不能关闭的, 只有等待Image的操作完毕后才可以关闭, 否则会出现 GDI+ 中发生一般性错误
                            //BitMap继承Image 
                            //百度解释:Bitmap 对象或一个 Image 对象从一个文件, 构造时该文件仍保留锁定对于对象的生存期。 因此, 无法更改图像并将其保存回它产生相同的文件
                            memoryStream.Close();
                        }
                        if (null != bitmap) {
                            //在Image操作完毕后, 回收Image所持有的资源
                            bitmap.Dispose();
                        }
                    } 
                }
                return null;
            }
    
            /// <summary>
            /// 批量将传入的Base64字符串集合转为BitMap的List集合(暂时没有使用到)
            /// </summary>
            /// <param name="values"></param>
            /// <returns></returns>
            private static List<Model.FileInfo> ConvertBase64StringToImageBatch(HttpContext context, List<String> values) {
    
                List<Model.FileInfo> fileInfoList = new List<Model.FileInfo>();
                if (values != null) {
                    foreach (String item in values) {
                        fileInfoList.Add(ConvertBase64StringToImageAndInsert(context, item));
                    }
                }
                return fileInfoList;
            }
    
            /// <summary>
            /// 对传入的Base64字符串进行一定的处理, 不然在做图片转换的时候会有影响
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            private static String parseBase64String(String value) {
                String result = String.Empty;//表示空字符串, 次字符串只读
    
                int index = value.IndexOf(",");
    
                result = value.Substring(index + 1, value.Length - index - 1);
    
                return result;
            }
        }
    }
  • 相关阅读:
    LOJ 3055 「HNOI2019」JOJO—— kmp自动机+主席树
    LOJ 2586 「APIO2018」选圆圈——KD树
    bzoj 3600 没有人的算术——二叉查找树动态标号
    bzoj 1257 余数之和 —— 数论分块
    bzoj 3998 弦论 —— 后缀自动机
    bzoj 2946 公共串 —— 后缀自动机
    bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机
    bzoj 2555 SubString —— 后缀自动机+LCT
    洛谷 P3804 [模板] 后缀自动机
    洛谷 P4106 / bzoj 3614 [ HEOI 2014 ] 逻辑翻译 —— 思路+递归
  • 原文地址:https://www.cnblogs.com/threadj/p/10535934.html
Copyright © 2011-2022 走看看