using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace Common
{
public static class ImageHelper
{
/// <summary>
/// 将图片转换成二进制
/// </summary>
/// <param name="img">传入的图片</param>
/// <param name="imgFormat"></param>
/// <returns>返回的二进制</returns>
public static byte[] ImageToBytes(Image img, ImageFormat imgFormat)
{
Bitmap bmp = new Bitmap(img);
MemoryStream ms = new MemoryStream();
bmp.Save(ms, imgFormat);
ms.Seek(0, SeekOrigin.Begin);
memStream.Seek(0, SeekOrigin.Begin); //及时定位流的开始位置
如果没有这句话,在后边读取数据库显示图片的时候就会报错,“无效参数”。因为save以后流的指针停在了最后,这时马上转换成byte[],通过断点调试会发现这个数组中的数据全是0,这样肯定不会转换成原来的图片。保证了保存的正确,读取的正确性才能最大限度的保证。
byte[] imgBytes = new byte[ms.Length];
ms.Read(imgBytes, 0, imgBytes.Length);
ms.Close();
return imgBytes;
}
/// <summary>
/// 将二进制转换成图片
/// </summary>
/// <param name="imgBytes">数据库中存储的二进制数据</param>
/// <returns>返回的图片</returns>
public static Image BytesToImage(byte[] imgBytes)
{
MemoryStream ms = new MemoryStream();
ms.Write(imgBytes, 0, imgBytes.Length);
ms.Seek(0, SeekOrigin.Begin);
Image img;
try
{
img = Image.FromStream(ms,true);
ms.Close();
}
catch (Exception ex)
{
img = null;
}
return img;
}
}
}
将从数据库中取到的byte[]数据转换成image后,用PictureBox.Image=img;就能显示图片了。
还有需要注意的是用完Steam流以后要及时Close()释放。这样显示图片的时候就不会再报“无效参数”的错误了。