防止将 PixelFormat 应用于 PictureBox 的 C# 代码中的“内存不足”错误

Preventing "Out of Memory" Errors in C# Code Applying PixelFormat to PictureBoxes

提问人:tomato bar 提问时间:11/16/2023 更新时间:11/16/2023 访问量:35

问:

我有一个 C# 应用程序,我在其中将选定的 PixelFormat 应用于 FlowLayoutPanel 中 PictureBox 控件内的图像。虽然代码可以正常工作,但我在某些情况下遇到了“内存不足”错误,我正在寻求有关如何防止这些错误的指导。

更新后的代码如下:

private void ApplyPixelFormatToPictureBoxes(PixelFormat pixelFormat)
{
    foreach (Control c in flowLayoutPanel1.Controls)
    {
        if (((Panel)c).BackColor != Color.Transparent)
        {
            PictureBox pictureBox = (PictureBox)((Panel)c).Controls[1];
            Bitmap bitmap = new Bitmap(pictureBox.Image.Width, pictureBox.Image.Height, pixelFormat);

            using (Graphics g = Graphics.FromImage(bitmap))
            {
                g.DrawImage(pictureBox.Image, 0, 0);
            }

            pictureBox.Image = bitmap;
        }
    }
}

private void bppArgb1555ToolStripMenuItem_Click(object sender, EventArgs e)
{
    try
    {
        ApplyPixelFormatToPictureBoxes(pf(sender));
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error applying pixel format: " + ex.Message);
        // Handle the error as needed
    }

    pictureboxpaint();
}

我特别感兴趣的是了解此代码中是否存在可能导致“内存不足”错误的潜在内存问题。在这种情况下处理图像时,我是否应该考虑优化或最佳实践来防止此类错误?

任何见解或建议将不胜感激!

C# WinForms GDI+

评论

0赞 PMF 11/16/2023
您在此处复制的位图有多大?
0赞 tomato bar 11/16/2023
@PMF 它是 640x640。
0赞 György Kőszeg 11/16/2023
您多久重新分配一次图像?旧图像显然没有被处理掉。你们使用什么像素格式?索引格式不支持获取 a 和 may throw ,这实际上与内存不足无关,它只是一个 GDI+ 状态代码转换为 .NET 异常。要将图像转换为索引格式,您可以使用此库中的方法(免责声明:由我编写)。GraphicsOutOfMemoryException
1赞 György Kőszeg 11/16/2023
好的,我注意到也许您尝试使用ARGB1555像素格式。不支持该像素格式(请参阅此处所有像素格式的表格)。但是链接方法可用于生成这样的位图。或者,您可以保留原始像素格式(在 WinForms 中渲染时,32 位 PARGB 是最快的格式),只需将其量化为ARGB1555颜色即可。Graphics.FromImage

答: 暂无答案