Android 实现4MB以上大图片压缩不失真方法
1 import java.io.ByteArrayOutputStream; 2 import java.io.File; 3 4 import android.content.Context; 5 import android.content.Intent; 6 import android.graphics.Bitmap; 7 import android.graphics.BitmapFactory; 8 import android.net.Uri; 9 import android.os.Environment; 10 import android.util.Base64; 11 12 public class PictureUtil { 13 14 /** 15 * 把bitmap转换成String 16 * 17 * @param filePath 18 * @return 19 */ 20 public static String bitmapToString(String filePath) { 21 Bitmap bm = getSmallBitmap(filePath); 22 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 23 bm.compress(Bitmap.CompressFormat.JPEG, 40, baos); 24 byte[] b = baos.toByteArray(); 25 int x = b.length; 26 System.out.println("" + x); 27 return Base64.encodeToString(b, Base64.DEFAULT); 28 29 } 30 31 /** 32 * 计算图片的缩放值 33 * 34 * @param options 35 * @param reqWidth 36 * @param reqHeight 37 * @return 38 */ 39 public static int calculateInSampleSize(BitmapFactory.Options options, 40 int reqWidth, int reqHeight) { 41 // Raw height and width of image 42 final int height = options.outHeight; 43 final int width = options.outWidth; 44 int inSampleSize = 1; 45 46 if (height > reqHeight || width > reqWidth) { 47 48 // Calculate ratios of height and width to requested height and 49 // width 50 final int heightRatio = Math.round((float) height 51 / (float) reqHeight); 52 final int widthRatio = Math.round((float) width / (float) reqWidth); 53 54 // Choose the smallest ratio as inSampleSize value, this will 55 // guarantee 56 // a final image with both dimensions larger than or equal to the 57 // requested height and width. 58 inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 59 } 60 61 return inSampleSize; 62 } 63 64 /** 65 * 根据路径获得突破并压缩返回bitmap用于显示 66 * 67 * @param imagesrc 68 * @return 69 */ 70 public static Bitmap getSmallBitmap(String filePath) { 71 final BitmapFactory.Options options = new BitmapFactory.Options(); 72 options.inJustDecodeBounds = true; 73 BitmapFactory.decodeFile(filePath, options); 74 75 // Calculate inSampleSize 76 options.inSampleSize = calculateInSampleSize(options, 480, 800); 77 78 // Decode bitmap with inSampleSize set 79 options.inJustDecodeBounds = false; 80 81 return BitmapFactory.decodeFile(filePath, options); 82 } 83 84 /** 85 * 根据路径删除图片 86 * 87 * @param path 88 */ 89 public static void deleteTempFile(String path) { 90 File file = new File(path); 91 if (file.exists()) { 92 file.delete(); 93 } 94 } 95 96 /** 97 * 添加到图库 98 */ 99 public static void galleryAddPic(Context context, String path) { 100 Intent mediaScanIntent = new Intent( 101 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 102 File f = new File(path); 103 Uri contentUri = Uri.fromFile(f); 104 mediaScanIntent.setData(contentUri); 105 context.sendBroadcast(mediaScanIntent); 106 } 107 108 /** 109 * 获取保存图片的目录 110 * 111 * @return 112 */ 113 public static File getAlbumDir() { 114 File dir = new File( 115 Environment 116 .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 117 getAlbumName()); 118 if (!dir.exists()) { 119 dir.mkdirs(); 120 } 121 return dir; 122 } 123 124 /** 125 * 获取保存 隐患检查的图片文件夹名称 126 * 127 * @return 128 */ 129 public static String getAlbumName() { 130 return "sheguantong"; 131 } 132 }
调用:
String content = PictureUtil.bitmapToString("/storage/sdcard0/Pictures/sheguantong/test.jpg");
System.out.println("" + content);