public override Photo Decode(string file)
        {
            byte[] buffer = File.ReadAllBytes(file);
            int    nBufferLength = buffer.Length;
            uint   nImageWidth, nImageHeight;
            uint   nBitsPerPixel;
            uint   nBitsCount;
            //byte[] imageBits;
            NativePhoto photo = null;

            unsafe
            {
                fixed(byte *pBuffer = buffer)
                {
                    FIMEMORY              fiMemory  = FreeImage.OpenMemory((IntPtr)pBuffer, nBufferLength);
                    FREE_IMAGE_FORMAT     fiFormat  = FreeImage.GetFileTypeFromMemory(fiMemory, nBufferLength);
                    FIBITMAP              fiBitmap  = FreeImage.LoadFromMemory(fiFormat, fiMemory, 0);
                    FREE_IMAGE_COLOR_TYPE colorType = FreeImage.GetColorType(fiBitmap);

                    HBitmap  hBitmap;
                    HPalette hPalette = IntPtr.Zero, hOldPalette = IntPtr.Zero;

                    nImageHeight  = FreeImage.GetHeight(fiBitmap);
                    nImageWidth   = FreeImage.GetWidth(fiBitmap);
                    nBitsPerPixel = FreeImage.GetBPP(fiBitmap);

                    //if (nBitsPerPixel <= 8)
                    //{
                    //    RGBQUAD[] rgb = FreeImage.GetPaletteCopy(fiBitmap);
                    //    LOGPALETTE logPalette = new LOGPALETTE();
                    //    logPalette.nPalVersion = 0x300;
                    //    logPalette.nPalEntries = 1 << 8;
                    //    PaletteEntry[] palEntries = new PaletteEntry[logPalette.nPalEntries];
                    //    for (int i = 0; i < logPalette.nPalEntries; i++)
                    //    {
                    //        palEntries[i].Blue = rgb[i].rgbBlue;
                    //        palEntries[i].Green = rgb[i].rgbGreen;
                    //        palEntries[i].Red = rgb[i].rgbRed;
                    //    }
                    //    fixed (PaletteEntry* pPalletteEntries = palEntries)
                    //    {
                    //        logPalette.pPalEntry = (IntPtr)pPalletteEntries;
                    //        hPalette = CreatePalette(&logPalette);
                    //    }
                    //}

                    HDC hDC = GetDC(IntPtr.Zero);

                    Debug.Assert(hDC != IntPtr.Zero);
                    //if (hPalette != IntPtr.Zero)
                    //{
                    //    hOldPalette = SelectPalette(hDC, hPalette, false);
                    //    RealizePalette(hDC);
                    //}
                    hBitmap = CreateCompatibleBitmap(hDC, (int)nImageWidth, (int)nImageHeight);
                    //    hBitmap = CreateDIBitmap(hDC, FreeImage.FreeImage_GetInfoHeader(fiBitmap), 0x04,
                    //FreeImage.GetBits(fiBitmap), FreeImage.FreeImage_GetInfo(fiBitmap), ColorUseOptions.DIB_PAL_COLORS);
                    int nResult = SetDIBits(hDC, hBitmap, 0, nImageHeight, FreeImage.GetBits(fiBitmap),
                                            FreeImage.FreeImage_GetInfo(fiBitmap), ColorUseOptions.DIB_RGB_COLORS);

                    Debug.Assert(nResult != 0);

                    if (hOldPalette != IntPtr.Zero)
                    {
                        SelectPalette(hDC, hOldPalette, false);
                    }

                    int width  = (int)(FreeImage.GetWidth(fiBitmap));
                    int height = (int)(FreeImage.GetHeight(fiBitmap));

                    photo = new NativePhoto(hBitmap, width, height);

                    ReleaseDC(IntPtr.Zero, hDC);
                    //if (hPalette != IntPtr.Zero)
                    //    info.PaletteHandle = hPalette;

                    FreeImage.Unload(fiBitmap);
                    FreeImage.CloseMemory(fiMemory);
                }
            }
            return(photo);
        }
 public static extern HPalette SelectPalette
 (
     HDC hdc,              // handle to DC
     HPalette hpal,        // handle to logical palette
     bool bForceBackground // foreground or background mode
 );