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 );