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; }
/// <summary> /// This is a javascript application. /// </summary> /// <param name="page">HTML document rendered by the web server which can now be enhanced.</param> public Application(IApp page) { // jsc able to take a random open source project // to encode a png file on the client, worker? // the code seems to be pre compiling. // how to use it? //Error 9 Unsafe code may only appear if compiling with /unsafe X:\jsc.svn\examples\javascript\io\synergy\PNGEncoderExperiment\PNGEncoderExperiment\opensource\FJCore\Image.cs 147 13 PNGEncoderExperiment //Error 1 'FluxJpeg.Core.HuffmanTable' does not contain a definition for 'Decode' and no extension method 'Decode' accepting a first argument of type 'FluxJpeg.Core.HuffmanTable' could be found(are you missing a using directive or an assembly reference ?) X:\jsc.svn\examples\javascript\io\synergy\PNGEncoderExperiment\PNGEncoderExperiment\opensource\FJCore\Decoder\JpegComponent.cs 468 29 PNGEncoderExperiment // X:\jsc.svn\examples\javascript\io\synergy\PNGEncoderExperiment\PNGEncoderExperiment\opensource\FJCore\Image.cs // 147 // is jsc ready for unsafe byte opcodes yet? // be have byref, async, why not also support pointers then? // #if SILVERLIGHT //0200002b Plupload.PngEncoder.PngEncoder //script: error JSC1000: Missing Script Attribute? Native constructor was invoked, please implement[System.IO.MemoryStream..ctor(System.Int32)] // 0200002b Plupload.PngEncoder.PngEncoder // script: error JSC1000: opcode unsupported - [0x01d7] bne.un + 0 - 2{[0x01ce] //rem // script: error JSC1000: error at Plupload.PngEncoder.PngEncoder.WriteImageData, // seems to be return from within try. // could the rewriter fix it for us? // X:\jsc.svn\examples\javascript\Test\TestReturnFromWithinTry\TestReturnFromWithinTry\Application.cs // or we fix this source for now? var w = 128; var h = 128; // black pixels? var data = new int[w * h]; var p = new PngEncoder( data, w, h, true, PngEncoder.FILTER_NONE, 0 ); // script: error JSC1000: unsupported flow detected, try to simplify. //Assembly U:\PNGEncoderExperiment.Application.exe //DeclaringType Plupload.PngEncoder.DeflaterHuffman + Tree, PNGEncoderExperiment.Application, //OwnerMethod BuildTree // Offset 030d var bytes = p.pngEncode(); new IHTMLPre { new { bytes } }.AttachToDocument(); }