/** * Get a deep copy of the image palette. * @param bitmap Pointer to a loaded image. * @return Array or RGBQUAD values representing the image palette. */ public static unsafe RGBQUAD [] GetPaletteCopy(FIBITMAP dib) { RGBQUAD [] paletteCopy = new FreeImageAPI.RGBQUAD[256]; // Only interested in indexed images. if (GetBPP(dib) <= 8) { UIntPtr palette = GetRawPalette(dib); byte * ptr = (byte *)(void *)palette; for (int q = 0; q < 256; q++) { paletteCopy[q] = new FreeImageAPI.RGBQUAD(); paletteCopy[q].rgbBlue = (byte)*ptr; ptr += 1; paletteCopy[q].rgbGreen = (byte)*ptr; ptr += 1; paletteCopy[q].rgbRed = (byte)*ptr; ptr += 1; paletteCopy[q].rgbReserved = (byte)*ptr; ptr += 1; } } return(paletteCopy); }
public ITexture2D GetIBLTexture(string path) { FreeImageAPI.FREE_IMAGE_FORMAT type = FreeImageAPI.FreeImage.GetFileType(path, 0); FreeImageAPI.FIBITMAP bitmap = FreeImageAPI.FreeImage.Load(type, path, FreeImageAPI.FREE_IMAGE_LOAD_FLAGS.DEFAULT); //FreeImageAPI.FIBITMAP convert = FreeImageAPI.FreeImage.ToneMapping(bitmap, FreeImageAPI.FREE_IMAGE_TMO.FITMO_DRAGO03, 0, 0); FreeImageAPI.FIBITMAP convert = FreeImageAPI.FreeImage.ToneMapping(bitmap, FreeImageAPI.FREE_IMAGE_TMO.FITMO_REINHARD05, 0, 0); if (bitmap.IsNull) { return(null); } uint width = FreeImageAPI.FreeImage.GetWidth(convert); uint height = FreeImageAPI.FreeImage.GetHeight(convert); int channelNo = 3; byte[] imgData = new byte[width * height * channelNo]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int idx = i * (int)width + j; FreeImageAPI.RGBQUAD color = new FreeImageAPI.RGBQUAD(); int byteIdx = idx * channelNo; byteIdx -= 1; bool pSuccess = FreeImageAPI.FreeImage.GetPixelColor(convert, (uint)j, (uint)i, out color); Color nColor = color.Color; imgData[byteIdx + 1] = color.rgbRed; imgData[byteIdx + 2] = color.rgbGreen; imgData[byteIdx + 3] = color.rgbBlue; if (!pSuccess) { return(null); } } } Texture2dGL text = Texture2dGL.Create((int)width, (int)height); IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(imgData, 0); text.LoadPixels(ptr, (int)width, (int)height, OpenTK.Graphics.OpenGL4.PixelInternalFormat.Rgb8, OpenTK.Graphics.OpenGL4.PixelFormat.Rgb, OpenTK.Graphics.OpenGL4.PixelType.UnsignedByte); return(text); }
/** Get a deep copy of the image palette. @param bitmap Pointer to a loaded image. @return Array or RGBQUAD values representing the image palette. */ public static unsafe RGBQUAD[] GetPaletteCopy(FIBITMAP dib) { RGBQUAD [] paletteCopy = new FreeImageAPI.RGBQUAD[256]; // Only interested in indexed images. if (GetBPP(dib) <= 8) { UIntPtr palette = GetRawPalette(dib); byte * ptr = (byte *)(void*)palette; for (int q = 0; q < 256; q++) { paletteCopy[q] = new FreeImageAPI.RGBQUAD(); paletteCopy[q].rgbBlue = (byte)*ptr; ptr += 1; paletteCopy[q].rgbGreen = (byte)*ptr; ptr += 1; paletteCopy[q].rgbRed = (byte)*ptr; ptr += 1; paletteCopy[q].rgbReserved = (byte)*ptr; ptr += 1; } } return paletteCopy; }