压缩100k图片不失真的方法;先获取图片的原始长度和宽度;然后计算图片的缩放值;最后等比例压缩;
下面代码是压缩的工具类;
public class PictureUtil { /** * 主方法 * * @param filePath * @return */ public static InputStream bitmapToString(String filePath) { Bitmap bm = getSmallBitmap(filePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 60, baos); // 把压缩后的数据baos存放到ByteArrayInputStream中 ByteArrayInputStream isBm = new ByteArrayInputStream( baos.toByteArray()); return isBm; } /** * 计算图片的缩放值 * * @param options * @param reqWidth * @param reqHeight * @return */ public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // Calculate ratios of height and width to requested height and // width final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // Choose the smallest ratio as inSampleSize value, this will // guarantee // a final image with both dimensions larger than or equal to the // requested height and width. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } /** * 根据路径获得突破并压缩返回bitmap用于显示 * * @param imagesrc * @return */ public static Bitmap getSmallBitmap(String filePath) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, 800, 480); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(filePath, options); } /** * 根据路径删除图片 * * @param path */ public static void deleteTempFile(String path) { File file = new File(path); if (file.exists()) { file.delete(); } } /** * 添加到图库 */ public static void galleryAddPic(Context context, String path) { Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(path); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); context.sendBroadcast(mediaScanIntent); } /** * 获取保存图片的目录 * * @return */ public static File getAlbumDir() { File dir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getAlbumName()); if (!dir.exists()) { dir.mkdirs(); } return dir; } /** * 获取保存 隐患检查的图片文件夹名称 * * @return */ public static String getAlbumName() { return "sheguantong"; } }
下面是上传图片的工具类;只需要提供图片url就可以了;
** * * 上传工具类上传压缩; * @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 =PictureUtil.bitmapToString(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=compressImage1(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, 100, 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()); return isBm; } catch (Exception e) { throw e; } } }
时间: 2024-10-28 15:48:09