Bitmap bitmap = new Bitmap(stream) 参数无效

Abafi 2012-01-12 02:17:07
代码:

//压缩图片
//图片压缩 如果图片大于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对象中?

...全文
4027 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Abafi 2012-01-15
  • 打赏
  • 举报
回复
已解决。
FromStream 只要图片 width和height没过 65535 pixel就不会触发 invalid parameter.
出错的原因 是 filestream获取的流不是 图片流。
真是一个粗心的错误。
dylike 2012-01-13
  • 打赏
  • 举报
回复
将大图分割保存。
Baesky 2012-01-12
  • 打赏
  • 举报
回复
stream 不包含图像数据,或者为 空引用(在 Visual Basic 中为 Nothing)。

- 或 -

stream 包含一个 PNG 图像文件,其单维大小大于 65,535 像素。

由于 GDI+ 解码器的限制,如果使用单维大小大于 65,535 像素的 .png 图像文件构造位图,将引发 System.ArgumentException。
meic1985 2012-01-12
  • 打赏
  • 举报
回复
楼主可以试试 Image类的 public static Image FromStream(Stream stream); 这个方法
meic1985 2012-01-12
  • 打赏
  • 举报
回复
//
// 摘要:
// 从指定的数据流初始化 System.Drawing.Bitmap 类的新实例。
//
// 参数:
// stream:
// 用于加载图像的数据流。
//
// 异常:
// System.ArgumentException:
// stream 不包含图像数据,或者为 null。- 或 -stream 包含一个 PNG 图像文件,其单维大小大于 65,535 像素。
public Bitmap(Stream stream);

这个构造函数的描述,应该是你的图片太大了,大于65535像素了。

111,113

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧