Я загрузил индексированное цветное изображение (8bppI) с уникальной палитрой в программу C#, и мне нужно получить доступ к index цветов в этом изображении. Однако единственной функцией доступа, по-видимому, является Bitmap.GetPixel (x, y), которая возвращает цвет, а не индекс. Когда этот же цвет вставляется обратно в растровое изображение того же формата и палитры, информация о цвете, по-видимому, неверно интерпретируется как индекс, и все идет к черту. Вот упрощенная версия кода для ясности вопроса:
public void CreateTerrainMap() {
visualization = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
visualizationLock = new LockBitmap(visualization);
Lock();
// "TerrainIndex.bmp" is a 256x256 indexed colour image (8bpp) with a unique palette.
// Debugging confirms that this image loads with its palette and format intact
Bitmap terrainColours = new Bitmap("Resources\\TerrainIndex.bmp");
visualization.Palette = terrainColours.Palette;
Color c;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
if (Terrain[x, y] < SeaLevel) {
c = Color.FromArgb(15); // Counterintuitively, this actually gives index 15 (represented as (0,0,0,15))
} else {
heatIndex = <some number between 0 and 255>;
rainIndex = <some number between 0 and 255>;
if (IsCoastal(x, y)) {
c = Color.FromArgb(35); // Counterintuitively, this actually gives index 35 (represented as (0,0,0,35))
} else {
// This returns an argb colour rather than an index...
c = terrainColours.GetPixel(rainIndex, heatIndex);
}
}
// ...and this seemingly decides that the blue value is actually an index and sets the wrong colour entirely
visualizationLock.SetPixel(x, y, c);
}
}
}
TerrainIndex выглядит следующим образом: TerrainIndex.bmp
Палитра выглядит следующим образом: Палитра
Вывод должен выглядеть следующим образом: Хорошо
Но вместо этого это выглядит так: Плохо
Обратите внимание, что океаны (индекс 15) и побережья (индекс 35) выглядят правильно, но все остальное исходит из неправильной части палитры.
Я не могу найти никакой полезной информации о работе с индексированным цветом растровые изображения в C#. Я действительно надеюсь, что кто-то может объяснить мне, что я могу делать неправильно, или указать мне правильное направление.