代码://压缩图片
//图片压缩 如果图片大于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对象中?
//图片压缩 如果图片大于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对象中?
解决方案 »
- 我做的备忘录那个我把输入的信息放在记事本里面,可是怎么当我的程序运行第二次的时候,我输入的东西又把上一次输入的给覆盖了呢??
- c#网站 VS上面正常浏览 IIS发布后也不可以(把VS打开就可以) 求解 不知道也帮顶下啊谢谢
- C# 中如何得到 IClassFactory 接口对象?
- 关于委托/事件的流程疑问
- 如何处理FileSystemWatcher文件夹监视产生的以下异常
- C#中如何切换桌面的其它的窗体、并获取它们的位置(坐标)?
- 100分求:Cell组件有SaveToBuffer函数VB调用实例,怎样在C#中调用
- .net框架是不是一个虚拟机???
- VS2013安装出现严重错误
- C#多线程安全访问控件,System.OutOfMemoryException异常
- 请指导正确方向
- 如何抓取页面中JS生成的HTML代码?
// 摘要:
// 从指定的数据流初始化 System.Drawing.Bitmap 类的新实例。
//
// 参数:
// stream:
// 用于加载图像的数据流。
//
// 异常:
// System.ArgumentException:
// stream 不包含图像数据,或者为 null。- 或 -stream 包含一个 PNG 图像文件,其单维大小大于 65,535 像素。
public Bitmap(Stream stream);这个构造函数的描述,应该是你的图片太大了,大于65535像素了。
FromStream 只要图片 width和height没过 65535 pixel就不会触发 invalid parameter.
出错的原因 是 filestream获取的流不是 图片流。
真是一个粗心的错误。