GDI+加载图片的最佳方法,去除资源锁定

By | 10月06日
Advertisement

最近开发图像识别,当对一个图片进行处理后重新保存的时候,报“A generic error occurred in GDI+”错误,百思不得其解

最后发现原因是:
To retain access to the source bits, GDI+ locks any source file, and forces the application to maintain the life of any source stream, for the life of theBitmap or the Image object.

解决的方法是加载的时候 用Graphics.DrawImage() 来copy Image到一个新建立的Bitmap 对象,然后对这个对像做其它的操作

Source Code

            string fileName = "1.png"; //fileNameCounter.ToString() + ".png";
            string imagePath = @"Sample Images\" + fileName;
            Bitmap b = Bitmap.FromFile(imagePath) as Bitmap;
            this.image = new Bitmap(b.Width, b.Height);
            using (Graphics graph = Graphics.FromImage(this.image))
            {
                graph.DrawImageUnscaled(b, 0, 0);
            }
            b.Dispose();

this.image做为过渡

            string fileName = "1.png"; //fileNameCounter.ToString() + ".png";
            string imagePath = @"Sample Images\" + fileName;
            this.image.Save(imagePath, ImageFormat.Png);

Similar Posts:

  • iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile?

    转自 http://blog.csdn.net/dqjyong/article/details/26969355 Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数也是图片文件的路径. 那么两种有什么区别吗? 肯定是有的.根据Apple的官方文档: imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话.如果缓存中没有找到相应的图

  • ImageView加载图片的简单方法

    在做项目的时候遇到一个需求,不仅需要用ImageView加载图片,而且要把这个图片保存为一个bigMap.试过用流的方式获取到图片再设置到imageView,但是感觉不是很简便.后来试着用ImageLoader直接加载并设置还是挺简便的,就两行代码: Bitmap bitmap = ImageLoader.getInstance().loadImageSync(url); ImageView.setBitmap(bitmap);

  • UIImage加载图片节省内存方法

    不要用[UIImage imageNamed:@"a.png"]. 用 [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"a.png"]];

  • 动态加载图片路径,保持JavaScript控件的相对独立性。

    根据新界面的要求,需要一部分图片来增强日期控件的美观性.考虑到既要实现加载图表的目标,又要保持控件的独立性以便将来的移植. 当时考虑有三种方法: 1.直接把路径写在js文件里,但如果引用页面路径层级改变就没辙了. 2.写个class,放在主题包里的css文件或者单独创建一个css文件给日期控件专用.但是控件中的其他元素并没有使用class的需要,单独建立相应css文档似乎小题大做. 3.把以上两个方法排除后,自然要采用动态加载图片路径的方法咯. 关键代码如下: //创建一个全局变量保存路径 va

  • Volley框架中加载图片的3种方式

    Volley框架中加载图片的3种方式,ImageRequest,NetworkImageView ,ImageLoader.最常用的是ImageLoader 和ImageRequest .记得导入Volley,这里不再介绍. ImageRequest的使用非常简单和StringRequest相似,也是继承于Request. 使用NetworkImageView控件加载网络图片,首先要在布局文件中加入 NetworkImageView控件的引用.然后在代码中对其进行设置. 布局文件: <com.a

  • 如何在TextView中加载图片

    public void showTesxtView() { /*第一种在textView加载图片的可行方法 * ImageGetter imageGetter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { // TODO 自动生成的方法存根 if (source !=null) { BitmapDrawable returnDrawable = (BitmapDrawable)

  • 在VC中使用GDI+从自定义资源中加载图片

    取之于网络,用之于网络 原来的网址:http://haohello.blog.163.com/blog/static/29566820111015104423311/ 在VC中使用GDI+从自定义资源中加载图片 resources文件夹上点右键,选"Insert",在弹出的"Insert Resource"对话框上点按钮"Import", 打开一个"Import Resource"对话框,在对话框的下面有一个"Ope

  • ListView异步加载图片是非常实用的方法

    ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: Java代码 package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.MalformedURLException; import java

  • Android开发之一种简单的异步加载图片方法

    首先说明的是,该方法已经被我抛弃了.之前用它,发现加载速度不好.具体没怎么细心的看. 现在我用volley了.拿出来只是给大家批判的. package com.souya.seller.util.ex; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.HashMap; impor

  • Android加载图片内存溢出问题解决方法

    1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用BitmapFact

Tags: