#c# #arrays #image-processing #for-loop #palette
#c# #массивы #обработка изображений #for-цикл #палитра
Вопрос:
Я знаю, что здесь должно загружаться исключение IndexOutOfBoundsException, и я обычно не стал бы публиковать информацию об этом, но я только что столкнулся с этим, пытаясь разобрать массив как палитру, используя следующий код. Оно выдает исключение, когда i = 0 и palette.Длина = 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;
Комментарии:
1.
if/else
В вашем коде, кстати, нет необходимости, поскольку0/3 == 0
.2. О, я думал, что это вызовет исключение DivideByZero.
3. Какая строка выдает исключение? Какова связь между
palette
иpalette1
?4. @user: вы делите не на 0, вы делите на 3.
Ответ №1:
Ваша переменная цикла i
ограничена palette.Length
, но вы пытаетесь присвоить ей palette1
. Нет гарантии, что он palette1
имеет ту же длину, что и palette
, и я предполагаю, что это не так — отсюда и ваша проблема.
Комментарии:
1. Я пробовал это, но палитра. Записи. Длина равна нулю и теперь не может быть добавлена к bitmap снова. В любом случае, это не объясняет, почему это сработало для последнего цикла.
2. @user: попробуйте добавить строку, чтобы явно проверить это
(palette.Length / 3) == palette1.Entries.Length
, и посмотреть, не получится ли это. Ваша вторая запись будет успешной, если вpalette1.Entries
будет по крайней мере 48 записей, что, очевидно, верно.3. Теперь он даже не входит в цикл, вместо этого выдает ошибку (параметр недопустим) при попытке переназначить палитру с помощью ‘bmp. Palette = палитра1;’. Похоже, что длина палитры1 равна нулю, поэтому она не будет зацикливаться, если 256 не равно 0.
4. Если существующая палитра bitmap имеет длину 0, то вы не можете изменить ее на месте. Вам нужно будет создать новое растровое изображение с новой палитрой и скопировать данные из старого растрового изображения, затем переназначить записи палитры.
5. Я скопировал ‘bmp’ в новое растровое изображение ‘bmp2’, а затем использовал ‘bmp2.Palette’, но я все еще получаю ту же проблему. Почему это должно отличаться от другого цикла, это тот же код, но с другим объемом данных?