[转]图片处理函数(自适应缩略图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;
        }
时间: 2024-08-07 19:46:21

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

C# 往Datatable中添加新行的步骤

以一个实例说明 //录入年份绑定 [csharp] view plain string str1=str.Remove(0,i); string str1=str.SubString(i); public void YearList(FineUIPro.DropDownList ddlYear) public void YearList(FineUIPro.DropDownList ddlYear) { //年份从15年到当前年//起止年份 int yearStart = 2015; int y

给DataTable中添加一行数据

一.如果该DataTable有两列,列的名称是Name,Age,且该DataTable的名称是dt; DataRow dr = dt.NewRow(); dr["Name"] = "Adam"; dr["Age"] = 6; dt.Rows.Add(dr);

C# DataTable中按字符串中的数字排序

例如datatable中有一列是门牌号格式是xx-xx-xx,或字符串中含有汉字或其他符号等等,如何按照正确的数字顺序排序呢? 1.获得字符串中的数字. 2.在datatable中添加一列,类型是Int或double或decimal类型的,转为排序准备.然后利用dataview.sort来排序. 1.获得字符串中的数字代码: /// <summary> /// 获取字符串中的数字 /// </summary> /// <param name="str"&g

如何在网页中添加地图

@{ Layout = null;} <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equi

在PHP中给图片添加缩略图

<?php //判断GD库是否存在 if (!function_exists('imagepng')) { die('GD库不存在'); } //图片路径 $imagePath = './img/a.jpg'; //获取图片信息 $imageInfo = getimagesize($imagePath); //获取图片扩展名 $imageExtension = image_type_to_extension($imageInfo[2], false); //获取图片 $func = 'image

Android中的缩略图加载-不浪费一点多余的内存

本文链接    http://blog.csdn.net/xiaodongrush/article/details/29355651 1. Why,为什么要加载缩略图? 有的时候不需要展示原图,只需展示图片的缩略图,可以节省内存.比如:网易新闻中的图片浏览,左边展示的小狮子图片就是一个缩略图,点击这个图片,才会展示原图.      2. How,怎么做呢? http://developer.android.com/training/displaying-bitmaps/load-bitmap.h

操作DataTable中的数据

在项目中,经常会遇到这样的问题.用SQL从数据库中选出需要的数据存入DataTable之后,需要进行一定的处理之后,才可以用来显示在页面上. 之前对这些问题,都是遇到一个就百度一个,没有系统的处理这些问题,今天就写个文档来处理一下这个问题 先来几个简单的喽. 添加列和行: (既然是整理, 那就写全一点吧,三个方法) #region 方法一: DataTable tblDatas =new DataTable("Datas"); //表名 DataColumn dc =null; dc

C#中DataTable中的Compute方法使用收集

原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详细内容请看这里“http://msdn2.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx”.而Filter则是条件过滤器,类似sql的Where条件. DataTable dt = new DataT

DataTable中执行DataTable.Select(&quot;条件&quot;),

我们在使用Sql ******这些数据库时,可以轻松的通过Sum.Aver.Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet,这个时候,可是没有办法回头去修改Select语句来获取这些统计了.那么在DataSet/DataTable中是否可以进行统计呢?答案是肯定的.   在MSDN中,有一篇MS推荐的统计方法,就是逐行对数据进行求和统计,这个方法,其实有等于无(或许这个方法只是针对于DataG