See https://sourceforge.net/p/openil/patches/42/ This patch allows luminance BMPs to be saved as straight grayscale, saving lots of space for colorless images. --- src-IL/src/il_bmp.c (revision 1662) +++ src-IL/src/il_bmp.c (working copy) @@ -928,6 +928,28 @@ } } + if((iCurImage->Format == IL_LUMINANCE) && (iCurImage->Pal.Palette == NULL)) + { + // For luminance images it is necessary to generate a grayscale BGR32 + // color palette. Could call iConvertImage(..., IL_COLOR_INDEX, ...) + // to generate an RGB24 palette, followed by iConvertPal(..., IL_PAL_BGR32), + // to convert the palette to BGR32, but it seemed faster to just + // explicitely generate the correct palette. + + iCurImage->Pal.PalSize = 256*4; + iCurImage->Pal.PalType = IL_PAL_BGR32; + iCurImage->Pal.Palette = (ILubyte*)ialloc(iCurImage->Pal.PalSize); + + // Generate grayscale palette + for (i = 0; i < 256; i++) + { + iCurImage->Pal.Palette[i * 4] = i; + iCurImage->Pal.Palette[i * 4 + 1] = i; + iCurImage->Pal.Palette[i * 4 + 2] = i; + iCurImage->Pal.Palette[i * 4 + 3] = 0; + } + } + // If the current image has a palette, take care of it TempPal = &iCurImage->Pal; if( iCurImage->Pal.PalSize && iCurImage->Pal.Palette && iCurImage->Pal.PalType != IL_PAL_NONE ) { @@ -948,8 +970,8 @@ //BITMAPINFOHEADER, so that the written header refers to //TempImage instead of the original image - // @TODO LUMINANCE converted to BGR insteaf of beign saved to luminance - if (iCurImage->Format != IL_BGR && iCurImage->Format != IL_BGRA && iCurImage->Format != IL_COLOUR_INDEX) { + if ((iCurImage->Format != IL_BGR) && (iCurImage->Format != IL_BGRA) && + (iCurImage->Format != IL_COLOUR_INDEX) && (iCurImage->Format != IL_LUMINANCE)) { if (iCurImage->Format == IL_RGBA) { TempImage = iConvertImage(iCurImage, IL_BGRA, IL_UNSIGNED_BYTE); } else {