图片上传服务器压缩工具类

这个是我整理调试的图片上传工具类;只需要图片路径方可;大家可以直接使用;希望可以帮助到大家;代码如下;


package com.wyy.twodimcode.push;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

/**
*
* 上传工具类上传压缩;
* @author spring sky
* Email:[email protected]
* QQ:840950105
* MyName:石明政
*/
public class UploadUtil {
private static final String TAG = "uploadFile";
private static final int TIME_OUT = 10*1000; //超时时间
private static final String CHARSET = "utf-8"; //设置编码
/**
* android上传文件到服务器
* @param file 需要上传的文件
* @param RequestURL 请求的rul
* @return 返回响应的内容
*/
public static String uploadFile(String file,String RequestURL)
{
String result = null;
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成
String PREFIX = "--" , LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data"; //内容类型

try {
URL url = new URL(RequestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true); //允许输入流
conn.setDoOutput(true); //允许输出流
conn.setUseCaches(false); //不允许使用缓存
conn.setRequestMethod("POST"); //请求方式
conn.setRequestProperty("Charset", CHARSET); //设置编码
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);

if(file!=null){
/**
* 当文件不为空,把文件包装并且上传
*/
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
InputStream is =compressImage(file);
byte[] bytes = new byte[9000];
int len = 0;
while((len=is.read(bytes))!=-1){
dos.write(bytes, 0, len);
}
is.close();
dos.write(LINE_END.getBytes());
byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
dos.write(end_data);
dos.flush();
/**
* 获取响应码 200=成功
* 当响应成功,获取响应的流
*/
int res = conn.getResponseCode();
Log.e(TAG, "response code:"+res);
// if(res==200)
// {
Log.e(TAG, "request success");
InputStream input = conn.getInputStream();
StringBuffer sb1= new StringBuffer();
int ss ;
while((ss=input.read())!=-1)
{
sb1.append((char)ss);
}
result = sb1.toString();
Log.e(TAG, "result : "+ result);
// }
// else{
// Log.e(TAG, "request error");
// }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}



public static InputStream compressImage(String file) {
Bitmap bitmap = BitmapFactory.decodeFile(file);
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds设为true
newOpts.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeFile(file, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 设置分辨率
float hh = 800f;
float ww = 400f;
// 缩放比。由于是固定的比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0) {
be = 1;
}
newOpts.inSampleSize = be;// 设置缩放比例
// 重新读入图片,注意此时已经把newOpts.inJustDecodeBounds = false
bitmap = BitmapFactory.decodeFile(file, newOpts);
try {
// Bitmap bitmapyas=compressImage(bitmap);
return compressImage2(bitmap);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}

public static InputStream compressImage2(Bitmap bitmap) throws Exception {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
int options = 100;
int size = baos.toByteArray().length / 1024;
while (size > 40 && options > 0) {
baos.reset();// 重置baos即清空baos
options -= 10;// 每次都减少10
// 这里压缩options%,把压缩后的数据存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
size = baos.toByteArray().length / 1024;
}
// 把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(
baos.toByteArray());
// 把ByteArrayInputStream数据生成图片
// bitmap = BitmapFactory.decodeStream(isBm, null, null);
// if (size > 40) {
// return true;
// } else {
// return false;
// }
return isBm;

} catch (Exception e) {
throw e;
}

}
// private static Bitmap compressImage(Bitmap image) {
//
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
// int options = 100;
// while ( baos.toByteArray().length / 1024>1024) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
// baos.reset();//重置baos即清空baos
// image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
// options -= 10;//每次都减少10
// }
// ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
// Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
// return bitmap;
// }
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。