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