Xamarin.Android 压缩图片并上传到WebServices

  随着手机的拍照像素越来越高,导致图片赞的容量越来越大,如果上传多张图片不进行压缩、质量处理很容易出现OOM内存泄漏问题。

  最近做了一个项目,向webservices上传多张照片,但是项目部署出来就会出现闪退现象,后来经行调试发现图片没有进行压缩,一张图片大小为2M,然而webservices没法接搜多个大图片,所以需要改下配置文件,我这里改为40M。

  <system.web>
    <httpRuntime maxRequestLength = "40960" useFullyQualifiedRedirectUrl="true"/>
  </system.web>

   这里改好后发现上传图片还是有问题,后来经过一步步调试发现将本地图片转换成Bitmap后没有清空,然后一直存放在内存中,导致内存泄漏。只要把转换完的Bitmap清空一下就好了。

        /// <summary>
        /// 图片转换成String流
        /// </summary>
        /// <param name="file_path">文件名(不带file://)</param>
        /// <returns></returns>
        public static string ImageToString(string file_path)
        {
            //待上传图片路径
            //string uploadFile = file_path;

            //转化成文件  

            //System.IO.FileInfo imgFile = new System.IO.FileInfo(uploadFile);

            ////文件转化成字节
            //byte[] imgByte = new byte[imgFile.Length];

            //////读文件
            //System.IO.FileStream imgStream = imgFile.OpenRead();

            //////文件写入到字节数组
            //imgStream.Read(imgByte, 0, Convert.ToInt32(imgFile.Length));

            //////字节数组转换成String类型
            //string by = Convert.ToBase64String(imgByte);

            ////上传到服务器 后面是文件名
            ////fileUp.UpdateFile(imgByte, Guid.NewGuid() + ".png");

            //return imgByte;  

            Bitmap bitmap = BitmapFactory.DecodeFile(file_path);        //将图片文件转换成bitmap 格式:/storage/emulated/0/DCIM/Camera/IMG_20180425_105725.jpg

            string bitstring = BitmapToString(bitmap);
            bitmap = null;              //一定要清空,否则会导致OOM问题
            GC.Collect();
            return bitstring;
        } 

        /// <summary>
        /// 图片缩放处理
        /// </summary>
        /// <param name="bgimage">Bitmap文件</param>
        /// <param name="newWidth">新图片宽度</param>
        /// <param name="newHeight">新图片高度</param>
        /// <returns></returns>
        public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight)
        {
            // 获取这个图片的宽和高
            float width = bgimage.Width;
            float height = bgimage.Height;
            // 创建操作图片用的matrix对象
            Matrix matrix = new Matrix();
            // 计算宽高缩放率
            float scaleWidth = ((float)newWidth) / width;
            float scaleHeight = ((float)newHeight) / height;
            // 缩放图片动作
            matrix.PostScale(scaleWidth, scaleHeight);
            Bitmap bitmap = Bitmap.CreateBitmap(bgimage, 0, 0, (int)width,
                            (int)height, matrix, true);
            return bitmap;
        }

        static  string  BitmapToString(Bitmap bitmap)
        {
            Bitmap bit = zoomImage(bitmap, 750, 1000);//小图
                                                   //质量压缩
            //MemoryStream stream = new MemoryStream();
            //bit.Compress(Bitmap.CompressFormat.Jpeg, 50, stream);
            //byte[] bitmapData = stream.ToArray();
            //Bitmap map = BitmapFactory.DecodeByteArray(bitmapData, 0, bitmapData.Length);
            //btn_imagetwo.SetImageBitmap(map);
            //Bitmap im = zoomImage(bitmap, 800, 900);//大图
            MemoryStream big_stream = new MemoryStream();
            bit.Compress(Bitmap.CompressFormat.Jpeg, 80, big_stream);
            byte[] big_bitmapData = big_stream.ToArray();
            return  Convert.ToBase64String(big_bitmapData);
        }        

  webservices接受进行保存图片:

     private String ImagePath = "/HandlerImages/";

        /// <summary>
        /// 上传图片
        /// </summary>
        /// <param name="content">图片字符流</param>
        /// <param name="pathandname">图片名称</param>
        /// <returns></returns>

        [WebMethod]
        public bool UpdateFile(string content, string pathandname)
        {
            //保存图片路径
            string FilePath = Server.MapPath(ImagePath);
            //判断路径是否存在
            if (!Directory.Exists(FilePath))
            {
                //创建路径
                Directory.CreateDirectory(FilePath);
            }

            string SaveFilePath = Path.Combine(FilePath, pathandname);
            byte[] fileBytes;
            try
            {
                fileBytes = Convert.FromBase64String(content);
                MemoryStream memoryStream = new MemoryStream(fileBytes); //1.定义并实例化一个内存流,以存放提交上来的字节数组。
                FileStream fileUpload = new FileStream(SaveFilePath, FileMode.Create); ///2.定义实际文件对象,保存上载的文件。
                memoryStream.WriteTo(fileUpload); ///3.把内存流里的数据写入物理文件
                memoryStream.Close();
                fileUpload.Close();
                fileUpload = null;
                memoryStream = null;
                return true;
            }
            catch
            {
                return false;
            }
        }

调用webservices上传图片:

MyWebService service = new MyWebService(); service.UpdateFile(ImageToByte("/storage/emulated/0/DCIM/Camera/IMG_20180425_105725.jpg"),Guid.NewGuid().ToString() + ".jpg");

原文地址:https://www.cnblogs.com/swjian/p/8944591.html

时间: 2024-10-08 15:05:56

Xamarin.Android 压缩图片并上传到WebServices的相关文章

ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结

相册 iphone的相册包含摄像头胶卷+用户计算机同步的部分照片.用户可以通过UIImagePickerController类提供的交互对话框来从相册中选择图像.但是,注意:相册中的图片机器路径无法直接从应用程序访问,只能通过终端用户去选择和使用相册图片 应用程序包 应用程序包可能会将图像与可执行程序.Info.plist文件和其他资源一同存储.我们可以通过本地文件路径来读取这些基于包的图像并在应用程序中显示它们. 沙盒 借助沙盒,我们可以把图片存储到Documents.Library.tmp文

使用PhoneGap裁剪和压缩图片并上传(安卓版)

安装phonegap的camera插件后,可以对从图片库选择图片进行裁剪或压缩操作,但插件本身有些问题,经过改进,现在可以顺利完成上述功能. 安装方法 1 首先使用命令行安装camera插件: phonegap plugin add org.apache.cordova.camera 2 安装成功后,下载下面的CameraLauncher.java文件,将插件包中的同名文件替换掉: http://phonegap.jiusem.net/camera/src/android/CameraLaunc

html5压缩图片并上传

手机端图片有很大的,上传的时候很慢,这时候就要压缩一下了,有一个开源的js可以压缩图片的大小,开源地址如下:https://github.com/think2011/localResizeIMG3 代码如下: // 上传图片 function uploadFile(path) { var type = plus.storage.getItem("upload_goods_image"); //选择成功 $("#heisebg").removeClass("

如何有效实现前端压缩图片并上传功能

随着现在手机的像素越来越高,很多照片动辄几兆甚至十几兆,上传后在服务器端压缩已经越来越不能满足当今的需求.这对于许多技术人员来说,处理起来这样的问题往往不知道该怎么下手,那么下面就跟大家讲解一下如何在前端进行图片压缩后上传到服务器. 以上传单张图片为例,多张图片同理,多嵌套一层循环即可.代码实现如下: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta

javaScript:压缩图片并上传

html代码: <input id="file" type="file" name="filesName"> js代码: var fileElement = document.getElementById('#file'); fileElement.onchange = function(){ var file = event.target.files[0]; var upload = new uploadThumbnail({ //

微信小程序压缩图片并上传到服务器(拿去即用)

这里注意一下,图片压缩后的宽度是画布宽度的一半 canvasToTempFilePath 创建画布的时候会有一定的时间延迟容易失败,这里加setTimeout来缓冲一下 这是单张图片压缩,多张的压缩暂时还没有成功,保存到服务器上后是空白的,如有大神望指点一二(>人<:) <canvas canvas-id='photo_canvas' style='width:1000rpx;height:{{canvas_h}}px' class='myCanvas'></canvas&g

js图片前端压缩多图上传(旋转其实已经好了只是手机端有问题要先压缩再旋转)

var filechooser = document.getElementById("choose"); // 用于压缩图片的canvas var canvas = document.createElement("canvas"); var ctx = canvas.getContext('2d'); // 瓦片canvas var tCanvas = document.createElement("canvas"); var tctx = tC

Android图片文件上传实例

原文:Android图片文件上传实例 源代码下载地址:http://www.zuidaima.com/share/1550463718132736.htm 支持拍照图片上传和从手机相册中获取图片上传到服务器端的功能 源码截图

Android高仿微信图片选择上传工具

源码托管地址:https://github.com/SleepyzzZ/photo-selector 话不多说,先上效果图(高仿微信图片选择器): 图片选择界面: 图片预览界面: 批量上传图片: 实现的功能介绍: 1.图片异步加载,使用Glide开源库实现加载; 2.图片的预览界面,支持左右滑动,双击放大浏览; 3.图片批量上传,使用OkHttp来实现与Servlet服务器的通信; 使用方法(Android Studio): 新建工程,File->New->Import Module导入pho