吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1415|回复: 18
收起左侧

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

[复制链接]
getstr88 发表于 2022-6-25 09:28
本帖最后由 getstr88 于 2022-6-25 20:43 编辑

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

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



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

[C#] 纯文本查看 复制代码
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
[C#] 纯文本查看 复制代码
        private  Image 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;
        }
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表