[转]图片处理函数(自适应缩略图datatable中添加缩略图像)

        /// <summary>
        /// 为DataTable指定行中的生成缩略图
        /// </summary>
        /// <param name="dataTable">数据源</param>
        /// <param name="dataTableImageColumnName">要生成缩略图的数据源的列名</param>
        /// <param name="appendSmallPicColumnName">新增缩略图数据列的列名</param>
        /// <param name="imageFormat">源图像格式</param>
        /// <param name="maxWidth">图像自适应的最大宽度</param>
        /// <param name="maxHeight">最像自适应的最大高度</param>
        public static void GetSmallPic(DataTable dataTable, string dataTableImageColumnName, string appendSmallPicColumnName, ImageFormat imageFormat, int maxWidth, int maxHeight)
        {
            var dc = new DataColumn(appendSmallPicColumnName, Type.GetType("System.Byte[]"));
            dataTable.Columns.Add(dc);
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                //生成缩略图GetSmallPic(dataTable.Rows[i], dataTableImageColumnName, appendSmallPicColumnName);
                var imageByte = (byte[])dataTable.Rows[i][dataTableImageColumnName];
                var ms = new MemoryStream(imageByte, 0, imageByte.Length);
                var sourceImage = Image.FromStream(ms);
                int newWidth, newHeight;
                ImageSelfAdaption(sourceImage, maxWidth, maxHeight, out newWidth, out newHeight);
                var myBitmap = new Bitmap(sourceImage, newWidth, newHeight);
                ms = new MemoryStream();
                myBitmap.Save(ms, imageFormat);
                dataTable.Rows[i][appendSmallPicColumnName] = ms.ToArray();
                ms.Close();
            }
        }
 
        /// <summary>
        /// 获取图像自适应后的宽高(设置最大宽高)
        /// </summary>
        /// <param name="image">图像</param>
        /// <param name="maxWidth">最大宽度</param>
        /// <param name="maxHeight">最大高度</param>
        /// <param name="newWidth">自适应后的图像宽度</param>
        /// <param name="newHeight">自适应后的图像高度</param>
        /// <returns></returns>
        public static void ImageSelfAdaption(Image image, int maxWidth, int maxHeight, out int newWidth, out int newHeight)
        {
            var originalWidth = image.Width;
            var originalHeight = image.Height;
            double _newWidth = maxWidth, _newHeight = maxHeight;
            double t = originalWidth > maxWidth ? maxWidth : originalWidth;
            if (originalHeight * t / originalWidth > maxHeight)
            {
                _newHeight = maxHeight;
                _newWidth = (double)maxHeight / originalHeight * originalWidth;
            }
            else
            {
                _newWidth = t;
                _newHeight = (t / originalWidth) * originalHeight;
            }
            newWidth = (int)_newWidth;
            newHeight = (int)_newHeight;
        }
 
        /// <summary>
        /// 获取补足透明区域的图像
        /// </summary>
        /// <param name="image">欲补足透明区域的图像</param>
        /// <param name="minComplementSize">补足透明区域的最小像素块大小(注:必须大于等于2)</param>
        /// <returns></returns>
        public static Bitmap GetComplementImage(Image image, int minComplementSize)
        {
            if (minComplementSize < 2)
            {
                return new Bitmap(image.Width, image.Height);
            }
            else
            {
                int newWidth = image.Width;
                int newHeight = image.Height;
                //宽度求余
                int width = image.Width % minComplementSize;
                //高度求余
                int height = image.Height % minComplementSize;
                //宽度不够
                if (width != 0)
                {
                    newWidth += minComplementSize - width;
                }
                if (height != 0) //高度不够
                {
                    newHeight += minComplementSize - height;
                }
                return new Bitmap(image, newWidth, newHeight);
            }
        }
 
        /// <summary>
        /// 获取图像对象
        /// </summary>
        /// <param name="imageByte">图像二进制数据</param>
        /// <returns></returns>
        public static Image GetImage(byte[] imageByte)
        {
            if (imageByte != null)
            {
                var ms = new MemoryStream();
                ms.Write(imageByte, 0, imageByte.Length);
                return Image.FromStream(ms);
            }
            return null;
        }

        /// <summary>
        /// 获取图像二进制数据
        /// </summary>
        /// <param name="image">图像</param>
        /// <param name="imageFormat">图像格式</param>
        /// <returns></returns>
        public static byte[] GetImageByteArray(Image image, ImageFormat imageFormat)
        {
            var ms = new MemoryStream();
            image.Save(ms, imageFormat);
            var img = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(img, 0, Convert.ToInt32(ms.Length));
            ms.Close();
            return img;
        }

 

posted @ 2015-06-26 09:31  果然  阅读(695)  评论(0编辑  收藏  举报