简体   繁体   English

将图像加载到 BitMap 时出现 Memory 异常

[英]Out of Memory exception while loading image to BitMap

I am working on app, that will edit images.我正在开发应用程序,它将编辑图像。 But it crashes because of system.outofmemoryexception , when I try to load the image from disc.但是当我尝试从光盘加载图像时,它会因为system.outofmemoryexception而崩溃。 My RAM is pretty empty, but what I observed is, that app crashes, when the memory reach 30MB in memory.我的 RAM 非常空,但我观察到的是,当 memory 在 memory 中达到 30MB 时,该应用程序崩溃了。 So maybe I need to allocate more memory?所以也许我需要分配更多的 memory? Here is the code, where the exception is called:这是调用异常的代码:

using(Bitmap DocasnyObrazek = (Bitmap)Bitmap.FromFile(otevreniSouboru.FileName)) {...} Here is full code for opening an loading image: using(Bitmap DocasnyObrazek = (Bitmap)Bitmap.FromFile(otevreniSouboru.FileName)) {...}这是打开加载图像的完整代码:

namespace Editor_Obrázků_2._0
{
    public partial class Form1 : Form
    {
        Bitmap Obrazek;//datová složka pro obrázek
        Color[,] Barvy; //datová složka pro barvy
        private void OtevriSoubor() //otevření souboru
        {
            OpenFileDialog otevreniSouboru = new OpenFileDialog();//deklarace metody
            otevreniSouboru.Filter = "Obrázky (*.bmp, *.jpg|*.bmp; *.jpg";//povolené přípony souboru
            otevreniSouboru.ShowDialog();//zobrazí okno pro vybrání souboru
            if (otevreniSouboru.FileName != "") //jestli existuje soubor tak otevřít
            {
                using(Bitmap DocasnyObrazek = (Bitmap)Bitmap.FromFile(otevreniSouboru.FileName))//using se stará o pamět, Obrázek bude přetypován na Bitmap
                {
                    if (DocasnyObrazek.Width <= 500 && DocasnyObrazek.Height <= 500) //pokud je menší než 500x500
                    {
                        if (Obrazek != null)
                        {
                            Obrazek.Dispose();
                            Obrazek = null;
                        }
                        Obrazek = (Bitmap)DocasnyObrazek.Clone();//přetypování a nahrání dat    "clone" neodkazuje na data ale předává je
                        Barvy = new Color[Obrazek.Width, Obrazek.Height]; //pole pro barvy
                        for (int sloupec = 0; sloupec < Obrazek.Width; sloupec++)//nahrání barev
                            for (int radek = 0; radek < Obrazek.Height; radek++)
                            {
                                Barvy[sloupec, radek] = Obrazek.GetPixel(sloupec, radek);
                            }
                        this.seznamEfektů.Enabled = true;
                    }
                    else//obrázek je příliš velký nelze načíst
                    {
                        MessageBox.Show("Obrázek je příliš velký", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }
                }
            }
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            OtevriSoubor();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (Obrazek != null)
            {
                e.Graphics.DrawImage(Obrazek, 10, 10);
            }
        }
    }
}

I found out, why this wasn't working.我发现,为什么这不起作用。 In the documentation the outofmemoryexception refers to problem with the jpg or bmp file, not problem with memory.在文档中,内存不足异常是指 jpg 或 bmp 文件的问题,而不是outofmemoryexception的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM