zoukankan      html  css  js  c++  java
  • 解决.NET CF 3.5 Bitmap(Stream)未处理异常问题

    VS2008开发环境,在进行.NET CF 3.5下的WM Socket编程时

    Bitmap bmp = new Bitmap(Stream)处出现未处理异常

     (图片引自:http://www.cnblogs.com/fsyiyun/archive/2011/03/30/1999672.html) 

    通过摸索,我发觉无论对对象进行内存回收,这个问题依然存在。

    究其原因,个人猜测是Bitmap实例化时本身就会打开MemoryStream流,所以再用MemoryStream就很容易内存泄露

    因此强列建议,当和Bitmap一起合用时,用 FileStream或其它变通方法替代MemoryStream并及时内存回收

    以下是使用参考示例:

    主要功能是:拍照上传。

    View Code
    public class PhotoHelper
    {
    BaseForm _form; //拍照上传窗体
    TextBox _txtFileName; //显示照片路径
    PictureBox _picPhoto; //显示照片缩略图

    public PhotoHelper(BaseForm form,TextBox txtFileName,PictureBox picPhoto)
    {
    _form = form;
    _txtFileName = txtFileName;
    _picPhoto = picPhoto;
    _picPhoto.Image = new Bitmap(300, 350);

    }

           #region 拍照逻辑
    public void TakePhoto()
    {
    //拍照-----------------------------
    CameraCaptureDialog ccd = new CameraCaptureDialog();
    ccd.Mode = CameraCaptureMode.Still;
    ccd.Owner = _form;
    ccd.Title = "拍照";
    ccd.Resolution = new Size(1600, 1200);
    ccd.StillQuality = CameraCaptureStillQuality.Normal;

    if (ccd.ShowDialog() == DialogResult.OK)
    {
    //将拍好的以缩略图显示
    ImageChangedArgs args = new ImageChangedArgs(ccd.FileName);
    using (Graphics g = Graphics.FromImage(_picPhoto.Image))
    {

    g.DrawImage(args.Image,
    new Rectangle(0, 0, _picPhoto.Image.Width, _picPhoto.Image.Height),
    new Rectangle(0, 0, args.Image.Width, args.Image.Height),
    GraphicsUnit.Pixel);

    }
    args.Dispose();
    args = null;

    _txtFileName.Text = ccd.FileName;


    }
    ccd.Dispose();
    ccd = null;
    }
    #endregion
          #region 照片上传逻辑

    public void PhotoSave()
    {
    if (string.IsNullOrEmpty(_txtFileName.Text))
    {
    Global.ShowMsg("无照片可上传");
    return;
    }

    string prompt = "确认上传照片?";
    if (Global.ShowYesNoMsg(prompt) == DialogResult.No)
    return;


    //将照片转换为byte[]
    Byte[] b = FileToBytes(_txtFileName.Text);

    #region todo 将Byte[] 通过webservice上传服务器,在此请加入自己代码
    // CommandAndTaskIdObj commandObj = _form.CommandAndTaskIdObj;
    //WsRmsg msg = Global.GetService().UpFile(commandObj.UserName, commandObj.CommandId ,commandObj.TaskId , b, _txtFileName.Text);
    //if (msg.Flag == 0)
    //{
    // b = null;
    // throw new Exception(msg.Emsg);
    //}
    #endregion

    Global.ShowMsg("照片上传成功");


    _txtFileName.Text = string.Empty;
    b = null;

    }
    #endregion

    static byte[] FileToBytes(string sFilePath)
    {
    FileStream inFile = null;
    try
    {
    byte[] binaryData;
    inFile = new FileStream(sFilePath, FileMode.Open, FileAccess.Read);
    binaryData = new Byte[inFile.Length];
    long bytesRead = inFile.Read(binaryData, 0, (int)inFile.Length);
    return binaryData;
    }
    catch (Exception ex)
    {
    throw ex;
    }
    finally
    {
    if (inFile != null)
    {
    inFile.Close();
    inFile.Dispose();
    }
    inFile = null;
    }
    }


    internal void PhotoDispose()
    {
    throw new NotImplementedException();
    }
    }

    public class ImageChangedArgs : EventArgs, IDisposable
    {
    private Bitmap image;
    /// <summary>
    /// used to create the thumbnail
    /// </summary>
    private Stream stream;
    public ImageChangedArgs(string imageFilePath)
    {

    try
    {
    this.stream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
    this.image = new Bitmap(this.stream);
    }
    catch(Exception ex)
    {
    this.image = null;
    if (this.stream != null)
    {
    this.stream.Close();
    this.stream = null;
    }
    }
    }

    public Bitmap Image
    {
    get
    {
    return this.image;
    }
    }

    public Stream Stream
    {
    get
    {
    return this.stream;
    }
    }

    #region IDisposable Members

    public void Dispose()
    {
    if (this.image != null)
    this.image.Dispose();
    this.image = null;
    if (this.stream != null)
    {
    this.stream.Close();
    this.stream.Dispose();
    }
    this.stream = null;
    }

    #endregion
    }

    从上个例子可以看出,MemoryStream类基本上被FileStream替代。

    当加载大的图片时,只要内存允许,就不会报Exception异常 

    这是第二篇博客,如有错误请及时指出,欢迎留爪~~

  • 相关阅读:
    【Language】 TIOBE Programming Community Index for February 2013
    【diary】good health, good code
    【web】a little bug of cnblog
    【Git】git bush 常用命令
    【web】Baidu zone ,let the world know you
    【diary】help others ,help yourself ,coding is happiness
    【Git】Chinese messy code in widows git log
    【windows】add some font into computer
    SqlServer启动参数配置
    关于sqlserver中xml数据的操作
  • 原文地址:https://www.cnblogs.com/lindaWei/p/2324523.html
Copyright © 2011-2022 走看看