zoukankan      html  css  js  c++  java
  • Image 类使用中的奇怪问题及解决办法

    近日写一站点
    需要一个这样的过程:

    服务器指定目录中存在一些图片。
    站点程序读取图片存入数据库并删除源图片。


    代码如下: 
    public static Photo ReadImage(string ImageFilePath)
    {
                
    //设置图片私有变量和属性。
                Photo photo = new Photo();

             
    //读取图片文件
                 photo.TheImage = System.Drawing.Image.FromFile(ImageFilePath);
                 
    //图片文件大小
                 photo.ImageLength = new FileInfo(ImageFilePath).Length;
                 photo.ImageFileName 
    = GetFileName(ImageFilePath);
                 photo.ImageType 
    = GetFileExtName(ImageFilePath);
                 
    //删除原文件
                 File.Delete(ImageFilePath);

                
    return Photo;
    }


    可在这个函数执行中,发现有很严重的问题,图片源文件无法删除。
    提示错误如下:
    文件“E:\SUNBOY\\temp\bd8df21a-5ff9-4dd8-aff8-6feb5d2b1f85\test.jpg”正由另一进程使用,因此该进程无法访问该文件。

    乍一看,这段代码应该是没问题的,怎么会出这样的错误呢?(我保证文件在进入这段代码前是不会被使用的)

    通过把 File.Delete(ImageFilePath);  放在
    //读取图片文件
                 photo.TheImage = System.Drawing.Image.FromFile(ImageFilePath);

    只前,之后的比较发现,罪魁祸首是System.Drawing.Image.FromFile(ImageFilePath);
    很显然,System.Drawing.Image.FromFile 函数在读取图片后,并没有关闭掉文件。
    跟平时编程的常识好象有些出入。
    例如:photo.ImageLength = new FileInfo(ImageFilePath).Length;
    经过测试发现,使用FileInfo 类获得文件的大小后,文件就被关闭了。

    很奇怪,不知道这里是bug 呢,还是刻意的。
    没办法,只好自己考虑了解决方法:
        读取文件流,使用System.Drawing.Image.FromStream 方法。

    这样就可以自己操作文件,自己进行关闭了。
    经过测试,这样是可行的,不过不知道效率如何!

    代码如下:
    public static Photo ReadImage(string ImageFilePath)
    {
                
    //设置图片私有变量和属性。
                Photo photo = new Photo();

                FileStream fs 
    = new FileStream(ImageFilePath, FileMode.Open);
                BinaryReader br 
    = new BinaryReader(fs);
                
    byte[] bytes=br.ReadBytes((int)fs.Length);
                br.Close();
                fs.Close();
                MemoryStream ms 
    = new MemoryStream(bytes);
             
                photo.TheImage 
    = System.Drawing.Image.FromStream(ms);
                photo.ImageLength 
    = new FileInfo(ImageFilePath).Length;
                photo.ImageFileName 
    = GetFileName(ImageFilePath);
                photo.ImageType 
    = GetFileExtName(ImageFilePath);

                File.Delete(ImageFilePath);
                
    return Photo;
    }




  • 相关阅读:
    VUE2.0项目实现动态修改请求的服务器地址
    el-select和data
    el-tree禁用
    国际化全部整理
    洛谷P2899 Cell Phone Network G 题解
    【nvidia jetson xavier】 Deepstream Yolov3示例模型运行
    【nvidia jetson xavier】 风扇开机自启动
    A Semisupervised CRF Model for CNN-Based Semantic Segmentation With Sparse Ground Truth
    Semi-supervised semantic segmentation needs strong, varied perturbations
    Remote Sensing Images Semantic Segmentation with General Remote Sensing Vision Model via a Self-Supervised Contrastive Learning Method
  • 原文地址:https://www.cnblogs.com/SUNBOY/p/478350.html
Copyright © 2011-2022 走看看