Example #1
0
        public MemoryStream getAsEncodedStream(string type = null, int quality = 90)
        {
            MemoryStream imageStream = new MemoryStream();

            if (type == null)
            {
                type = this.type != "" ? this.type : JPEG.MIME;
            }

            if (type == JPEG.MIME)             // Encode as JPEG
            {
                byte[][,] raster = _bm.ToRaster();

                FluxJpeg.Core.Image jpegImage = new FluxJpeg.Core.Image(new ColorModel {
                    colorspace = ColorSpace.RGB
                }, raster);

                JpegEncoder jpegEncoder = new JpegEncoder(jpegImage, quality, imageStream);
                jpegEncoder.Encode();

                if (_img != null)
                {
                    // strip off any headers that might be left by encoder, etc
                    imageStream = new MemoryStream(((JPEG)_img).stripHeaders(imageStream));

                    if (_preserveHeaders)
                    {
                        imageStream = new MemoryStream(((JPEG)_img).insertHeaders(imageStream));
                    }
                }
            }
            else if (type == PNG.MIME)             // Encode as PNG
            {
                PngEncoder pngEncoder = new PngEncoder(_bm.Pixels, _bm.PixelWidth, _bm.PixelHeight, false, PngEncoder.FILTER_NONE, Deflater.BEST_COMPRESSION);
                byte[]     pngBuffer  = pngEncoder.pngEncode();
                imageStream.Write(pngBuffer, 0, pngBuffer.Length);
            }
            else
            {
                Error(this, null);
                return(null);
            }
            return(imageStream);
        }
        private Stream ResizeImage(Stream image_stream, int width, int height, int quality, ImageType type)
        {
            try {
                // Load the image as a writeablebitmap
                WriteableBitmap writableBitmap;
                BitmapImage     bitmapImage = new BitmapImage();
                bitmapImage.SetSource(image_stream);
                writableBitmap = new WriteableBitmap(bitmapImage);

                double scale = Math.Min((double)width / writableBitmap.PixelWidth, (double)height / writableBitmap.PixelHeight);

                // No resize needed
                if (scale >= 1.0)
                {
                    return(image_stream);
                }

                // Setup shorter names and pixelbuffers
                int   w = writableBitmap.PixelWidth;
                int   h = writableBitmap.PixelHeight;
                int[] p = writableBitmap.Pixels;
                byte[][,] imageRaster = new byte[3][, ];                // RGB colors
                imageRaster[0]        = new byte[w, h];
                imageRaster[1]        = new byte[w, h];
                imageRaster[2]        = new byte[w, h];

                // Copy WriteableBitmap data into buffer for FluxJpeg
                int i = 0;
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        int color = p[i++];

                        imageRaster[0][x, y] = (byte)(color >> 16);                          // R
                        imageRaster[1][x, y] = (byte)(color >> 8);                           // G
                        imageRaster[2][x, y] = (byte)(color);                                // B
                    }
                }

                // Create new FluxJpeg image based on pixel data
                FluxJpeg.Core.Image jpegImage = new FluxJpeg.Core.Image(new ColorModel {
                    colorspace = ColorSpace.RGB
                }, imageRaster);

                // Calc new proportional size
                width  = (int)Math.Round(writableBitmap.PixelWidth * scale);
                height = (int)Math.Round(writableBitmap.PixelHeight * scale);

                // Resize the image
                ImageResizer resizer      = new ImageResizer(jpegImage);
                Image        resizedImage = resizer.Resize(width, height, FluxJpeg.Core.Filtering.ResamplingFilters.LowpassAntiAlias);
                Stream       imageStream  = new MemoryStream();

                if (type == ImageType.Jpeg)
                {
                    // Encode the resized image as Jpeg
                    JpegEncoder jpegEncoder = new JpegEncoder(resizedImage, quality, imageStream);
                    jpegEncoder.Encode();
                }
                else
                {
                    int[] pixelBuffer = new int[resizedImage.Height * resizedImage.Width];
                    byte[][,] resizedRaster = resizedImage.Raster;

                    // Convert FJCore raster to PixelBuffer
                    for (int y = 0; y < resizedImage.Height; y++)
                    {
                        for (int x = 0; x < resizedImage.Width; x++)
                        {
                            int color = 0;

                            color = color | resizedRaster[0][x, y] << 16;                             // R
                            color = color | resizedRaster[1][x, y] << 8;                              // G
                            color = color | resizedRaster[2][x, y];                                   // B

                            pixelBuffer[(y * resizedImage.Width) + x] = color;
                        }
                    }

                    // Encode the resized image as Png
                    PngEncoder pngEncoder = new PngEncoder(pixelBuffer, resizedImage.Width, resizedImage.Height, false, PngEncoder.FILTER_NONE, Deflater.BEST_COMPRESSION);
                    byte[]     pngBuffer  = pngEncoder.pngEncode();
                    imageStream.Write(pngBuffer, 0, pngBuffer.Length);
                }

                return(imageStream);
            } catch {
                // Ignore the error and let the server resize the image
            }

            return(image_stream);
        }