显示png图片代码:
CPaintDC dc(this);
image = Image::FromFile(L"1.png");
Graphics graphics(dc.GetSafeHdc());
graphics.DrawImage(image, 0, 0, 200, 200);父进程显示1.png后会启动一个子进程,子进程做一些工作会得到新的图片并试图把图片保存为1.png,然后父进程刷新显示。但这里有个问题,父进程第一次显示1.png后会一直占用它,子进程无法修改图片。怎么解除父进程对图片的占用呢?gdi+image

解决方案 »

  1.   

    graphics.DrawImage(image, 0, 0, 200, 200);//image 释放即可
    delete image ;
    image =null;
      

  2.   

    保存Bitmap,打开很方便,保存就不那么的方便了。Bitmap或者Image打开图像会自动锁定文件,保存时会产生文件被使用之类的错误。一种折衷的办法是,保存时全新创建一个Bitmap(Image)对象,将原来的对象画到新对象上,然后将原来的对象删除以释放文件。保存新对象。不能用clone,它会将锁定的文件资源一块复制过来,则解锁文件需要的释放对象就又多了一个。
     Bitmap* tPic= new Bitmap(L"dotLive.jpg");//锁定文件
     Bitmap* Image = new Bitmap(tPic->GetWidth() ,tPic->GetHeight() ,tPic->GetPixelFormat());
     Graphics g(Image);
     g.DrawImage(tPic,0,0,m_nWidth,m_nHeight);//复制过来
     delete tPic;//解锁以前打开的文件
      /// … use the Image to access "dotLive.jpg" … 使用image访问”dotlive JPG。”   ///
     CLSID tiffClsid;
     GetEncoderClsid(L"image/jpeg", &tiffClsid);//这个函数MSDN中有
    Image->Save(L"dotLive.jpg" ,&tiffClsid);//保存
    -------------------------是不是想这样
      

  3.   

    Image image(L"1.png");
    Graphics graphics(dc.GetSafeHdc());
    graphics.DrawImage(&image, 0, 0, 200, 200);Image::FromFile这个会创建一个临时对象,但用完后不会马上释放的
      

  4.   


    或者
    CPaintDC dc(this);
    image = new Image(L"1.png");
    Graphics graphics(dc.GetSafeHdc());
    graphics.DrawImage(image, 0, 0, 200, 200);
    delete image;