c# - Image compression is not working -


i have operation on site takes crops image, resultant, cropped image coming out larger in terms of file size (original 24k , cropped image 650k). found need apply compression image before saving it. came following:

public static system.drawing.image cropimage(system.drawing.image image, rectangle croprectangle, imageformat format) {     var croppedimage = new bitmap(croprectangle.width, croprectangle.height);     using (var g = graphics.fromimage(croppedimage))     {         g.interpolationmode = interpolationmode.highqualitybicubic;         g.drawimage(             image,              new rectangle(new point(0,0), new size(croprectangle.width, croprectangle.height)),              croprectangle,              graphicsunit.pixel);          return compressimage(croppedimage, format);     } }  public static system.drawing.image compressimage(system.drawing.image image, imageformat imageformat) {     var bmp = new bitmap(image);     var codecinfo = encoderfactory.getencoderinfo(imageformat);     var encoder = system.drawing.imaging.encoder.quality;     var parameters = new encoderparameters(1);     var parameter = new encoderparameter(encoder, 10l);     parameters.param[0] = parameter;      using (var ms = new memorystream())     {         bmp.save(ms, codecinfo, parameters);         var resultimage = system.drawing.image.fromstream(ms);         return resultimage;     } } 

i set quality low see if there change @ all. there isn't. crop being saved correctly appearance-wise compression no joy. if bypass compressimage() altogether, neither file size nor image quality appear different.

so, 2 questions. why nothing happening? there simpler way compress resultant image "web-optimize" similar how photoshop saves web images (i thought stripped lot of info out of reduce size).

your problem must 'compress' (really encode) image save it, not before save it. image object in program uncompressed.

by saving memorystream , reading out stream encode image , decode same size again (with quality loss in process if using jpeg). however, if save file compression parameters, compressed image file.

using routine jpeg quality level 90 on 153 kb source image gives output image of 102 kb. if want smaller file size (with more encoding artifacts) change encoder parameter smaller 90.

public static void savejpegimage(system.drawing.image image, string filename) {     imagecodecinfo codecinfo = imagecodecinfo.getimageencoders()         .where(r => r.codecname.toupperinvariant().contains("jpeg"))         .select(r => r).firstordefault();      var encoder = system.drawing.imaging.encoder.quality;     var parameters = new encoderparameters(1);     var parameter = new encoderparameter(encoder, 90l);     parameters.param[0] = parameter;      using (filestream fs = new filestream(filename, filemode.create))     {         image.save(fs, codecinfo, parameters);     } } 

Comments

Popular posts from this blog

python - Subclassed QStyledItemDelegate ignores Stylesheet -

java - HttpClient 3.1 Connection pooling vs HttpClient 4.3.2 -

SQL: Divide the sum of values in one table with the count of rows in another -