Xamarin.Android 压缩图片并上传到WebServices
随着手机的拍照像素越来越高,导致图片赞的容量越来越大,如果上传多张图片不进行压缩、质量处理很容易出现OOM内存泄漏问题。
最近做了一个项目,向webservices上传多张照片,但是项目部署出来就会出现闪退现象,后来经行调试发现图片没有进行压缩,一张图片大小为2M,然而webservices没法接搜多个大图片,所以需要改下配置文件,我这里改为40M。
<system.web>
<httpRuntime maxRequestLength = "" 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, , , (int)width,
(int)height, matrix, true);
return bitmap;
} static string BitmapToString(Bitmap bitmap)
{
Bitmap bit = zoomImage(bitmap, , );//小图
//质量压缩
//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, , 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");
Xamarin.Android 压缩图片并上传到WebServices的更多相关文章
- 使用canvas压缩图片 并上传
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结
相册 iphone的相册包含摄像头胶卷+用户计算机同步的部分照片.用户可以通过UIImagePickerController类提供的交互对话框来从相册中选择图像.但是,注意:相册中的图片机器路径无法直 ...
- HTML5 Canvas前台压缩图片并上传到服务器
1.前台代码: <input id="fileOne" type="file" /> <input id="btnOne" ...
- js压缩图片并上传,不失真,保证图片清晰度
<!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- html5压缩图片并上传
手机端图片有很大的,上传的时候很慢,这时候就要压缩一下了,有一个开源的js可以压缩图片的大小,开源地址如下:https://github.com/think2011/localResizeIMG3 代 ...
- Xamarin.Android 使用AsyncTask提示上传动态
我们有时候会通过WebServices上传数据,如果信息量过大并没有提示,用户会觉得是死机,或是系统崩溃,这时候我们可以用到AsyncTask(异步任务)来提示上传信息,例如:正在上传数据... 这里 ...
- javaScript:压缩图片并上传
html代码: <input id="file" type="file" name="filesName"> js代码: var ...
- 微信小程序 压缩图片并上传
转自https://segmentfault.com/q/1010000012507519 wxml写入 <view bindtap='uploadImg'>上传</view> ...
- 微信小程序压缩图片并上传到服务器(拿去即用)
这里注意一下,图片压缩后的宽度是画布宽度的一半 canvasToTempFilePath 创建画布的时候会有一定的时间延迟容易失败,这里加setTimeout来缓冲一下 这是单张图片压缩,多张的压缩暂 ...
随机推荐
- php json 写入 mysql 的例子
$a['aaa']='aaaa'; $a['bbb']='bbb'; $a['ccc']='ccc'; $arr['step_name']='kfkf'; $arr['process_name']=' ...
- Es6(Symbol,set,map,filter)
首先再讲这几个新东西之前,先说一个Es6中新出的扩展运算符(...) 1.展开运算符,就是把东西展开,可以用在array和object上 比如: let a=[,] let b=[,...a,]//[ ...
- AS3中的getChildByName
[转载的...............] 在AS3中,我们可以用getChildByName来获取一个元件,但是要注意返回的类型是DisplayObject,这样一旦我们的元件中有一些自定义的方法就不 ...
- pipeline-安全测试
代码安全检查 需要安装SonarQube(版本6.7,安装了Findbugs插件) MySQL >=5.6,笔者安装的是MySQL 5.7版本 Jenkins需要安装下列插件: SonarQub ...
- django mysql 数据库配置
在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库. DATABASES = { 'default': { 'ENGINE': 'django.db. ...
- Js学习(6) 标准库-Array对象
Array是Js的原生对象,同时也是一个构造函数,可以用它生成新的数组 用不用new结果都一样 var arr = new Array(2); // 等同于 var arr = Array(2); 但 ...
- CentOS7 安装oracle客户端
1.本机环境CentOS7 64 [root@localhost etc]# uname -a Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 ...
- Delphi过程和函数中变量的作用域
变量的作用域是指变量能被某一子程序识别的范围. 全局变量和局部变量.全局变量是指在程序的type区定义的变量,而局部变量是在过程或函数的定义部分声明的变量.全局变量在整个程序中都有意义,局部变量只在它 ...
- 深入理解JVM(三)垃圾收集器和内存分配策略
3.1 关于垃圾收集和内存分配 垃圾收集和内存分配主要针对的区域是Java虚拟机中的堆和方法区: 3.2 如何判断对象是否“存活”(存活判定算法) 垃圾收集器在回收对象前判断其是否“存活”的两个算法: ...
- jenkins可选插件为空的解决方式
我是安装的jenkins,文件名字是这个jenkins.msi,点finish安装完成,然后浏览器就自动打开了jenkins页面,输入密码后,便进入了如下页面 之后我是选择的跳过插件安装,在可选插件里 ...