C#处理大图片

lylinsir2008 2009-03-03 05:19:55
今天要用C#写个图片切割的软件(要求图片能够在picturebox中显示出来) 因为要处理的图片过大(150M左右)所以出现了一些问题 源代码如下
由于图片过大 所以首先想到先发图片压缩再显示出来 下面是一个图片压缩的类 网上找的
/// <summary>
/// 压缩图片类
/// </summary>
class ImgGDI
{
public ImgGDI()
{
//构造函数
}

/// <summary>
/// Bitmap转换byte[]数组
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public byte[] Bmptobyte(Bitmap bmp)
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
ms.Flush();
byte[] buffer = ms.GetBuffer();
ms.Close();
return buffer;
}

/// <summary>
/// byte[]数组转换Bitmap
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public Bitmap bytetobmp(byte[] buffer)
{
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}

/// <summary>
/// 返回默认图片
/// </summary>
/// <returns></returns>
public Bitmap getInstance()
{
Bitmap bmp = DefaultPic();
return bmp;
}

/// <summary>
/// 选取本地图片
/// </summary>
/// <param name="IMG"></param>
/// <returns></returns>
public Bitmap LocalIMG(string IMG)
{
FileStream fs = new FileStream(IMG, FileMode.Open);
Bitmap bmp = new Bitmap(fs);
fs.Close();
return bmp;
}

/// <summary>
/// 返回流状态图片
/// </summary>
/// <param name="Img"></param>
/// <returns></returns>
public Bitmap ImgFromBase64(string Img)
{
Bitmap bmp;
byte[] buffer = Convert.FromBase64String(Img);
if (buffer.Length > 0)
{
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
else
{
bmp = DefaultPic();
return bmp;
}
}

/// <summary>
/// 默认图片
/// </summary>
/// <returns></returns>
private Bitmap DefaultPic()
{
FileStream fs = new FileStream(Application.StartupPath + @"\Goodr.jpg", FileMode.Open);
Bitmap bmp = new Bitmap(fs);
fs.Close();
return bmp;
}

/// <summary>
/// GDI压缩图片
/// </summary>
/// <param name="bmp">传入参数Bitmap</param>
/// <returns></returns>
public byte[] ImageGdi(Bitmap bmp)
{


MemoryStream ms = new MemoryStream();


if (bmp != null)
{
Bitmap t = new Bitmap(bmp);//这里有问题,当图片较小的时候没有问题(7、8M左右)当图片大的时候提示构造函数的参数无效
t.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
}
byte[] buffer;
ms.Flush();
if (ms.Length > 95000)
{
//buffer = ms.GetBuffer();
double new_width = 0;
double new_height = 0;

Image m_src_image = Image.FromStream(ms);
if (m_src_image.Width >= m_src_image.Height)
{
new_width = 1024;
new_height = new_width * m_src_image.Height / (double)m_src_image.Width;
}
else if (m_src_image.Height >= m_src_image.Width)
{
new_height = 768;
new_width = new_height * m_src_image.Width / (double)m_src_image.Height;
}

Bitmap bbmp = new Bitmap((int)new_width, (int)new_height, m_src_image.PixelFormat);
Graphics m_graphics = Graphics.FromImage(bbmp);
m_graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
m_graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
m_graphics.DrawImage(m_src_image, 0, 0, bbmp.Width, bbmp.Height);

ms = new MemoryStream();

bbmp.Save(ms, ImageFormat.Jpeg);
buffer = ms.GetBuffer();
ms.Close();

return buffer;
}
else
{
buffer = ms.GetBuffer();
ms.Close();
return buffer;
}
}


}
以下是我的调用代码
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ImgGDI img = new ImgGDI();
Bitmap btp = img.LocalIMG("211.jpg");
byte[] bt = img.ImageGdi(btp);
Bitmap btpsmall = img.bytetobmp(bt);
pictureBox1.Image = (Image)btpsmall;

}

private void label1_Click(object sender, EventArgs e)
{

}
}
图片小的时候没有问题 图片大的时候(150M)时就出现了上面注释那里出现的错误 参数无效
请大家帮忙看看 帮忙改下算法 或者提出一种更好的算法 谢谢
...全文
299 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cswat 2009-03-03
  • 打赏
  • 举报
回复
帮忙顶下
iwxiaot 2009-03-03
  • 打赏
  • 举报
回复
帮顶一下
lylinsir2008 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 findcaiyzh 的回复:]
你的bmp是传入的参数,已经可以被构造出来了。

奇怪为什么以bmp再构造一个会有问题.
Bitmap t = new Bitmap(bmp);

要不你不要构造新的t了,直接用bmp。我看你只是掉了个t.Save();
[/Quote]

直接构造是不行的 会提示GDI+常规错误的异常
wenbin 2009-03-03
  • 打赏
  • 举报
回复
压缩可以使用插值算法。这样把大图像变成小图像
具体算法在AForge里面有,一共3种插值算法
宝_爸 2009-03-03
  • 打赏
  • 举报
回复
你的bmp是传入的参数,已经可以被构造出来了。

奇怪为什么以bmp再构造一个会有问题.
Bitmap t = new Bitmap(bmp);

要不你不要构造新的t了,直接用bmp。我看你只是掉了个t.Save();
qiqundelang 2009-03-03
  • 打赏
  • 举报
回复
乱的很

110,538

社区成员

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

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

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