最近项目完成了,一些图片处理方法给大家共享下,因为此项目中竟是些图片。
多张图片上传我是用的GitHub上的框架,加载图片用的是picasso,picasso如果有人不太了解可以看我后期的文章,会大致讲解下这里就不多说了
起初是使用鲁班压缩的但是上传出了问题不得不换一种压缩方法了,以下为简单的压缩方法。
//压缩图片并保存 public String compress(String path, int width, int height, Context context) { ImageCompress compress = new ImageCompress(); ImageCompress.CompressOptions options = new ImageCompress.CompressOptions(); options.uri = Uri.fromFile(new File(path)); options.maxWidth = width; options.maxHeight = height; Bitmap bitmap = compress.compressFromUri(context, options); String picName = new File(path).getName(); int degree = HttpUtil.getBitmapDegree(path); Matrix matrix = new Matrix(); matrix.postRotate(degree); Bitmap returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); FileUtilss.saveBitmap(returnBm, picName); return Environment.getExternalStorageDirectory() + "/Photo_LJ/" + picName; 【这里的路径和FileUtils必须一样】
}
下面是调用的方法:
不过这个有两个压缩工具类我也是扒拉网上的根据需求改了一些,一个是ImageCompress,另一个是FileUtils
public class ImageCompress { public static final String CONTENT = "content"; public static final String FILE = "file"; /** * 图片压缩参数 * @author Administrator * */ public static class CompressOptions { public static final int DEFAULT_WIDTH = 400; //[看你们需要压缩成什么样] public static final int DEFAULT_HEIGHT = 800; public int maxWidth = DEFAULT_WIDTH; public int maxHeight = DEFAULT_HEIGHT; /** * 压缩后图片保存的文件 */ public File destFile; /** * 图片压缩格式,默认为jpg格式 */ public CompressFormat imgFormat = CompressFormat.JPEG; /** * 图片压缩比例 默认为30 */ public int quality = 5; public Uri uri; } public Bitmap compressFromUri(Context context, CompressOptions compressOptions) { // uri指向的文件路径 String filePath = getFilePath(context, compressOptions.uri); if (null == filePath) { return null; } BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap temp = BitmapFactory.decodeFile(filePath, options); int actualWidth = options.outWidth; int actualHeight = options.outHeight; int desiredWidth = getResizedDimension(compressOptions.maxWidth, compressOptions.maxHeight, actualWidth, actualHeight); int desiredHeight = getResizedDimension(compressOptions.maxHeight, compressOptions.maxWidth, actualHeight, actualWidth); options.inJustDecodeBounds = false; options.inSampleSize = findBestSampleSize(actualWidth, actualHeight, desiredWidth, desiredHeight); Bitmap bitmap = null; Bitmap destBitmap = BitmapFactory.decodeFile(filePath, options); // If necessary, scale down to the maximal acceptable size. if (destBitmap.getWidth() > desiredWidth || destBitmap.getHeight() > desiredHeight) { bitmap = Bitmap.createScaledBitmap(destBitmap, desiredWidth, desiredHeight, true); destBitmap.recycle(); } else { bitmap = destBitmap; } // compress file if need if (null != compressOptions.destFile) { compressFile(compressOptions, bitmap); } return bitmap; } /** * compress file from bitmap with compressOptions * * @param compressOptions * @param bitmap */ private void compressFile(CompressOptions compressOptions, Bitmap bitmap) { OutputStream stream = null; try { stream = new FileOutputStream(compressOptions.destFile); } catch (FileNotFoundException e) { Log.e("ImageCompress", e.getMessage()); } bitmap.compress(compressOptions.imgFormat, compressOptions.quality, stream); } private static int findBestSampleSize(int actualWidth, int actualHeight, int desiredWidth, int desiredHeight) { double wr = (double) actualWidth / desiredWidth; double hr = (double) actualHeight / desiredHeight; double ratio = Math.min(wr, hr); float n = 1.0f; while ((n * 2) <= ratio) { n *= 2; } return (int) n; } private static int getResizedDimension(int maxPrimary, int maxSecondary, int actualPrimary, int actualSecondary) { // If no dominant value at all, just return the actual. if (maxPrimary == 0 && maxSecondary == 0) { return actualPrimary; } // If primary is unspecified, scale primary to match secondary's scaling // ratio. if (maxPrimary == 0) { double ratio = (double) maxSecondary / (double) actualSecondary; return (int) (actualPrimary * ratio); } if (maxSecondary == 0) { return maxPrimary; } double ratio = (double) actualSecondary / (double) actualPrimary; int resized = maxPrimary; if (resized * ratio > maxSecondary) { resized = (int) (maxSecondary / ratio); } return resized; } /** * 获取文件的路径 * * @return */ private String getFilePath(Context context, Uri uri) { String filePath = null; if (CONTENT.equalsIgnoreCase(uri.getScheme())) { Cursor cursor = context.getContentResolver().query(uri, new String[] { Images.Media.DATA }, null, null, null); if (null == cursor) { return null; } try { if (cursor.moveToNext()) { filePath = cursor.getString(cursor .getColumnIndex(Images.Media.DATA)); } } finally { cursor.close(); } } // 从文件中选择 if (FILE.equalsIgnoreCase(uri.getScheme())) { filePath = uri.getPath(); } return filePath; } }
这里是FileUtils工具类
public class FileUtilss { public static String SDPATH = Environment.getExternalStorageDirectory() + "/Photo_LJ/"; public static void saveBitmap(Bitmap bm, String picName) { try { if (!isFileExist("")) { File tempf = createSDDir(""); } File f = new File(SDPATH, picName ); if (f.exists()) { f.delete(); } FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static File createSDDir(String dirName) throws IOException { File dir = new File(SDPATH + dirName); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { System.out.println("createSDDir:" + dir.getAbsolutePath()); System.out.println("createSDDir:" + dir.mkdir()); } return dir; } public static boolean isFileExist(String fileName) { File file = new File(SDPATH + fileName); file.isFile(); return file.exists(); } public static void delFile(String fileName){ File file = new File(SDPATH + fileName); if(file.isFile()){ file.delete(); } file.exists(); } public static void deleteDir() { File dir = new File(SDPATH); if (dir == null || !dir.exists() || !dir.isDirectory()) return; for (File file : dir.listFiles()) { if (file.isFile()) file.delete(); else if (file.isDirectory()) deleteDir(); } dir.delete(); } public static boolean fileIsExists(String path) { try { File f = new File(path); if (!f.exists()) { return false; } } catch (Exception e) { return false; } return true; } public static void createPath(String path) { File file = new File(path); if (!file.exists()) { file.mkdir(); } } }
这样图片压缩就可以了,3M图片压缩到了50kb左右,需要的朋友可以尽情压缩使用。