【问题标题】:c# - Bitmap Palette throws index out of bounds exception when the index is not out of boundsc# - 当索引未超出范围时,Bitmap Palette 抛出索引超出范围异常
【发布时间】:2011-04-14 15:47:47
【问题描述】:

我知道您必须在此处加载 IndexOutOfBoundsException,而且我通常不会发布有关它的内容,但我只是在尝试使用以下代码将数组解析为调色板时遇到它。它在 i = 0 和palette.Length = 768 时抛出异常,我不明白为什么,我确信这段代码之前有效:

        ColorPalette palette1 = bmp.Palette;

        for (int i = 0; i < palette.Length; i += 3)
        {
            if (i != 0)
            {
                Color b = Color.FromArgb(255, palette[i], palette[i + 1], palette[i + 2]);
                palette1.Entries[i/3] = b;
            }

            else
            {
                Color b = Color.FromArgb(255, palette[i], palette[i + 1], palette[i + 2]);
                palette1.Entries[i] = b;
            }
        }

        bmp.Palette = palette1;

以下代码确实有效,但在单独的函数中使用了较小的调色板:

        ColorPalette palette1 = bmp.Palette;

        for (int i = 0; i < 48; i += 3)
        {
            if (i != 0)
            {
                Color b = Color.FromArgb(255, palette[i], palette[i + 1], palette[i + 2]);
                palette1.Entries[i / 3] = b;
            }

            else
            {
                Color b = Color.FromArgb(255, palette[i], palette[i + 1], palette[i + 2]);
                palette1.Entries[i] = b;
            }
        }

        bmp.Palette = palette1;

【问题讨论】:

  • 代码中的if/else 是不必要的,顺便说一下,因为0/3 == 0
  • 哦,我以为它会抛出 DivideByZero 异常。
  • 哪一行抛出异常? palettepalette1是什么关系?
  • @user:你不是除以 0,而是除以 3。

标签: c# arrays image-processing for-loop palette


【解决方案1】:

您的循环变量ipalette.Length 为界,但您试图分配给palette1。不能保证palette1 的长度与palette 的长度相同,我的猜测是它没有——因此是你的问题。

【讨论】:

  • 我试过了,但是palette.Entries.Length 为零,现在无法再次添加到位图中。无论如何,这并不能解释为什么它在最后一个循环中起作用。
  • @user:尝试添加一行来明确检查(palette.Length / 3) == palette1.Entries.Length,看看它是否失败。只要palette1.Entries 中至少有 48 个条目,您的第二个条目就会成功,这显然是正确的。
  • 它现在甚至没有进入循环,而是在尝试使用“bmp.Palette = palette1;”重新分配调色板时抛出错误(参数无效)。好像palette1的长度为零,所以如果256不等于0就不会循环。
  • 如果现有位图调色板的长度为 0,则无法就地修改。您必须使用新调色板创建新位图并从旧位图中复制数据,然后重新分配调色板条目。
  • 我已将“bmp”复制到新的位图“bmp2”,然后使用“bmp2.Palette”,但我仍然遇到同样的问题。为什么这与另一个循环不同,它是相同的代码,但数据量不同?
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多