getstr88 发表于 2022-6-25 09:28

C# 用非占用方式打开图片,得到bitmap,但后续操作bitmap就报内存溢出?

本帖最后由 getstr88 于 2022-6-25 20:43 编辑

如下面代码,执行到bitmap.Clone这里报内存溢出
但是把LoadImageFile函数,换成IImage.FromFile就不报错了。

但是我不能用Image.FromFile,因为不允许占用图片,要求打开图片后立即释放handle,不能阻碍其他程序使用那个图片文件


所以求助:
1、想知道我下面这种写法报错的原因。
2、想知道怎么实现不占用打开图片后续还能正常操作bitmap

private void Form1_Load(object sender, EventArgs e)
      {
            Bitmap bitmap = LoadImageFile(@"D:\1.tif");
            bitmap = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), PixelFormat.Format1bppIndexed);
            MessageBox.Show("1");
      }

      public static Bitmap LoadImageFile(string filePath)
      {
            FileStream fileStream = File.OpenRead(filePath);
            Image image = Image.FromStream(fileStream);
            fileStream.Close();
            return (Bitmap)image;
      }

落红护花 发表于 2022-6-25 09:40

你可以直接打开图片,需要操作图片时再dispose

getstr88 发表于 2022-6-25 09:45

落红护花 发表于 2022-6-25 09:40
你可以直接打开图片,需要操作图片时再dispose
???
给下代码吧,直接打开图片是怎么个函数,打开图片的方式我知道的有4种(Image.loadFromFile, Image.loadFromStream, new Bitmap, 要么先file读取再字节转图片),不知你说的哪种

forutry 发表于 2022-6-25 09:46

先做一个检测,检测图片是否打开,检测没有打开,就进行下一步,打开就提示关闭,然后你再调用打开命令,打开后再做一个确认是否关闭(这一步关闭可以省略掉)。

getstr88 发表于 2022-6-25 09:47

forutry 发表于 2022-6-25 09:46
先做一个检测,检测图片是否打开,检测没有打开,就进行下一步,打开就提示关闭,然后你再调用打开命令,打 ...

完全和我要的不是一个东西

我要的是,将一个图片文件载入为bitmap,但载入完,立即释放这个文件,不影响其他应用或者操作系统再打开这个

落红护花 发表于 2022-6-25 09:49

forutry 发表于 2022-6-25 09:46
先做一个检测,检测图片是否打开,检测没有打开,就进行下一步,打开就提示关闭,然后你再调用打开命令,打 ...

from file
然后你直接操作文件会报错,例如删除
操作前先dispose

forutry 发表于 2022-6-25 09:50

getstr88 发表于 2022-6-25 09:47
完全和我要的不是一个东西

我要的是,将一个图片文件载入为bitmap,但载入完,立即释放这个文件,不影 ...

不做判断,那就调用完关闭它就可以了

getstr88 发表于 2022-6-25 09:51

落红护花 发表于 2022-6-25 09:49
from file
然后你直接操作文件会报错,例如删除
操作前先dispose

兄弟,你看看我问的是什么。你都dispose。我还能操作bitmap?

getstr88 发表于 2022-6-25 09:52

forutry 发表于 2022-6-25 09:50
不做判断,那就调用完关闭它就可以了

Image.load 后怎么关?它是一直占用

谁将平生葬倾城 发表于 2022-6-25 09:52

      privateImage LoadImg(string src)
      {
            byte[] file = System.IO.File.ReadAllBytes(src);
            using (MemoryStream ms = new MemoryStream(file))
            {
                return Image.FromStream(ms);
            }
      }
      private void Form1_Load(object sender, EventArgs e)
      {
            Image img = LoadImg(@"C:\Users\SkyEebb\Desktop\a.png");
            this.pictureBox1.Image = img;
      }
页: [1] 2
查看完整版本: C# 用非占用方式打开图片,得到bitmap,但后续操作bitmap就报内存溢出?