博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【WP8】图片压缩处理
阅读量:6883 次
发布时间:2019-06-27

本文共 2866 字,大约阅读时间需要 9 分钟。

最近在做图片上传功能,类似于微信朋友圈的功能,现在的手机像素都比较高,手机上的图片一般都比较大(几M),对于大图,在上传之前,我们需要对图片进行压缩(分辨率和质量),再上传到服务器,以减少网路流量传输

  实现思路:

    判断图片是否大于指定的大小

      否:原图上传

      是:通过BitmapImage检测出图片分辨率,然后将分辨率限制在1200*1200分辨率以内(保持宽高比),然后通过SaveJpeg方法写入到流中

  笔者测试,绝大部分图片处理后都能控制在300kb以内(部分超过一点)

using System;using System.IO;using System.Windows;using System.Windows.Controls;using System.Windows.Media.Imaging;namespace XTuOne.Utility.Helpers{    public class ImageHelper    {        ///         /// 压缩图片        ///         /// 输入        /// 压缩质量        /// 最大大小(单位kb)只供参考        public static Stream CompressImage(Stream imageStream, int quality = 80, int maxKb = 300)        {            if (imageStream.Length > 300*1024)            {                if (imageStream.CanSeek)                {                    imageStream.Seek(0, SeekOrigin.Begin);                }                var bitmapImage = new BitmapImage();                bitmapImage.SetSource(imageStream);                var writeableBitmap = new WriteableBitmap(bitmapImage);                var tempStreamm = new MemoryStream();                var size = GetSize(bitmapImage.PixelWidth, bitmapImage.PixelHeight);                writeableBitmap.SaveJpeg(tempStreamm, (int)size.Width, (int)size.Height, 0, 80);                return tempStreamm;            }            return imageStream;        }        private static Size GetSize(Size size)        {            return GetSize(size.Width, size.Height);        }        private static Size GetSize(double width, double height)        {            if (width > height)            {                if (width > 1200)                {                    return new Size(1200, Convert.ToInt32(height * 1200 / width));                }                return new Size(width, height);            }            else            {                if (height > 1200)                {                    return new Size(Convert.ToInt32(width * 1200 / height), 1200);                }                return new Size(width, height);            }        }    }}

 测试中发现一个问题:如果图片太大(5000*5000)的话,BitmapImage读取出来的宽高会被限制在4096*4096之内,如果超过4096,则取4096,保持宽高比,所以如果图片过大,通过BitmapImage是无法获取到图片的真实分辨率的

 

下面演示读取SavePicture文件夹中的图片,并进行压缩

var library = new MediaLibrary();        foreach (var savedPicture in library.SavedPictures)        {            using (var stream = savedPicture.GetImage())            {                using (var tempStream = ImageHelper.CompressImage(stream))                {                    Debug.WriteLine("图片压缩前大小:{0:f2}kb, 图片压缩后大小:{1:f2}kb", stream.Length/1024.0,                        tempStream.Length/1024.0);                }                GC.Collect();            }        }

注意:对图片的处理(特别是比较大的图片)很容易造成内存不足的情况(笔者在测试的时候,处理到第三张图片(比较大的图片5-10M)的时候就会出现内存不足的情况)

  所以在使用的时候,没用的Stream应该及时释放掉(using),如果有多张图片需要处理

  为了防止内存不足造成异常,可以通过延迟处理,在处理完一张图片后,等待100毫秒,然后继续

//延迟0.1秒        await Task.Delay(100);

转载地址:http://eejbl.baihongyu.com/

你可能感兴趣的文章
微信小程序简单入门2
查看>>
15个NoSql数据库
查看>>
IOS 永远保持横竖屏方法
查看>>
加密传输SSL协议7_SSL协议概述
查看>>
常用数据类型
查看>>
windows
查看>>
tp3.2 事务处理
查看>>
Alpha 冲刺 (5/10)
查看>>
类的静态字段和构造函数
查看>>
TLE之前,没有一个节点叫失败!!!
查看>>
机器学习入门之二:一个故事说明什么是机器学习(转载)
查看>>
利用MySQL存储过程分割字符串
查看>>
Webkit statistics of Android
查看>>
哥德巴赫猜想
查看>>
动态规划3--Help Jimmy
查看>>
Java常用英语汇总(面试必备)
查看>>
负载均衡的认识
查看>>
Swing-选项卡面板JTabbedPane-入门
查看>>
(21/24) webpack实战技巧:webpack对三方类库的优化操作
查看>>
复利完结观看评价
查看>>