Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }