public void Write(System.Drawing.Image i, System.IO.Stream s) { if (!(i is Bitmap)) { throw new ArgumentException("FreeImageEncoder only works with bitmaps"); } FIBITMAP bit = FreeImage.CreateFromBitmap(i as Bitmap); if (bit.IsNull) { throw new ImageProcessingException("FreeImageEncoder failed to convert System.Drawing.Bitmap to FIBITMAP"); } if (Format == FREE_IMAGE_FORMAT.FIF_GIF || (Format == FREE_IMAGE_FORMAT.FIF_PNG && colors != -1)) { FreeImage.SetTransparent(bit, true); FIBITMAP old = bit; //TODO - ColorQuantizeEx returns null no matter what we do.. Is it because the image is 32-bit? bit = FreeImage.ColorQuantizeEx(bit, FREE_IMAGE_QUANTIZE.FIQ_NNQUANT, 256, 1, RGBQUAD.ToRGBQUAD(new Color[] { Color.Transparent })); if (bit.IsNull) { bit = old; } else if (bit != old) { FreeImage.UnloadEx(ref old); } } FreeImage.SaveToStream(ref bit, s, Format, EncodingOptions, true); }
private FIBITMAP formatImage(FIBITMAP dib, int icoSize, int dstBpp) { const int hideOpacity = 128; //FIBITMAP dibTmp = FreeImage.Rescale(dib, icoSize, icoSize, FREE_IMAGE_FILTER.FILTER_BICUBIC); FIBITMAP dibTmp = FreeImage.Rescale(dib, icoSize, icoSize, FREE_IMAGE_FILTER.FILTER_LANCZOS3); if (dstBpp >= 32) { return(dibTmp); } int paletteSize = (int)Math.Pow(2, dstBpp); byte lastPaletteIdx = (byte)(paletteSize - 1); // quantize ico // reserve last one palette, to set transparent //FIBITMAP dibTmp2 = FreeImage.ConvertColorDepth(dibTmp, FREE_IMAGE_COLOR_DEPTH.FICD_04_BPP); FIBITMAP dibOut = FreeImage.ColorQuantizeEx(dibTmp, FREE_IMAGE_QUANTIZE.FIQ_WUQUANT, paletteSize - 1, null, dstBpp); // set transparent color index to last one palette RGBQUAD rgb = new RGBQUAD(); byte val = 0; for (int m = icoSize - 1; m >= 0; --m) { string str = ""; for (int n = icoSize - 1; n >= 0; --n) { FreeImage.GetPixelIndex(dibOut, (uint)n, (uint)m, out val); FreeImage.GetPixelColor(dibTmp, (uint)n, (uint)m, out rgb); //uint val = rgb.uintValue & 0x00FFFFFF; if (rgb.rgbReserved <= hideOpacity) { FreeImage.SetPixelIndex(dibOut, (uint)n, (uint)m, ref lastPaletteIdx); } str += val + ","; } } FreeImage.Unload(dibTmp); //uint bpp = FreeImage.GetBPP(dibOut); // set transarency table try { RGBQUAD[] palette = new Palette(dibOut).AsArray; byte[] transparency = new byte[palette.Length]; for (int m = 0; m < palette.Length; ++m) { transparency[m] = 0xFF; if (m == lastPaletteIdx) { transparency[m] = 0; } } FreeImage.SetTransparencyTable(dibOut, transparency); } catch (Exception) { } return(dibOut); }