代码://压缩图片
        //图片压缩  如果图片大于100k,那么压缩图片。
        /// <summary>
        /// 传入值 Oracle中的byte[]图片
        /// 返回值 压缩后的byte[]图片 jpg格式,100k以下
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public byte[] CompressPic(byte[] data)
        {
            #region 原始
            MemoryStream ms = new MemoryStream();
            ms.Write(data, 0, data.Length); //byte[]写入到ms中
            Bitmap bitmap = new Bitmap(ms); //从ms流得到图片 3M的时候提示参数无效 391万,
            //如果图片长或宽超过6.5万个像素,就会报错.即 图片的像素个数不能超过42.25万。400kb            string curdir = System.Windows.Forms.Application.StartupPath + "temp.jpg";
            bitmap.Save(curdir, System.Drawing.Imaging.ImageFormat.Jpeg); //存成temp.jpg,减小图片
            FileStream fs = new FileStream(curdir, FileMode.Open, FileAccess.Read);  // /fs从.jpg 生成流            while (fs.Length > 100000) //文件的大小是否大于100k
            {
                //bitmap = new Bitmap(curdir); //获取硬盘jpg 原始图片
                bitmap = new Bitmap(fs);//从fs获取大图
                Bitmap newmap = new Bitmap(Convert.ToInt32(bitmap.Width * 0.8), Convert.ToInt32(bitmap.Height * 0.8)); //宽高缩小为原来的0.8
                Graphics g = Graphics.FromImage(newmap);
                Rectangle orinrec = new Rectangle(0, 0, bitmap.Width, bitmap.Height); //原始图片范围
                Rectangle newrec = new Rectangle(0, 0, newmap.Width, newmap.Height);
                g.DrawImage(bitmap, newrec, orinrec, GraphicsUnit.Pixel);
                bitmap.Dispose();
                fs.Dispose();
                newmap.Save(curdir, System.Drawing.Imaging.ImageFormat.Jpeg);
                fs = new FileStream(curdir, FileMode.Open, FileAccess.Read);
            }            byte[] result = new byte[fs.Length];
            SafeRead(fs, result);             fs.Dispose();  //fs释放 .jpg
            bitmap.Dispose();
            File.Delete(curdir);
            return result;
            #endregion
问题如下:  
CompressPic(byte[] data) 的data是从数据库中读的BLOB对象,一个3M的图像,存成byte[]数组,长度是300多万。MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length); //byte[]写入到ms中
Bitmap bitmap = new Bitmap(ms); //byte[]的长度是300多万的时候,  这句报错,参数无效。存入数据库的图片大小很容易就超过3M, 用什么办法取出来,放到Bitmap或者Image对象中?

解决方案 »

  1.   

            //
            // 摘要:
            //     从指定的数据流初始化 System.Drawing.Bitmap 类的新实例。
            //
            // 参数:
            //   stream:
            //     用于加载图像的数据流。
            //
            // 异常:
            //   System.ArgumentException:
            //     stream 不包含图像数据,或者为 null。- 或 -stream 包含一个 PNG 图像文件,其单维大小大于 65,535 像素。
            public Bitmap(Stream stream);这个构造函数的描述,应该是你的图片太大了,大于65535像素了。
      

  2.   

    楼主可以试试 Image类的 public static Image FromStream(Stream stream); 这个方法
      

  3.   

    stream 不包含图像数据,或者为 空引用(在 Visual Basic 中为 Nothing)。- 或 -stream 包含一个 PNG 图像文件,其单维大小大于 65,535 像素。由于 GDI+ 解码器的限制,如果使用单维大小大于 65,535 像素的 .png 图像文件构造位图,将引发 System.ArgumentException。
      

  4.   

    已解决。
    FromStream 只要图片 width和height没过 65535 pixel就不会触发 invalid parameter.
    出错的原因 是 filestream获取的流不是 图片流。 
    真是一个粗心的错误。