編輯:關於android開發
比如,項目中調用相,返回一張圖片一眼看過去,就是放大後才有區別。
1. 項目中用到的的代碼
// 從SD卡裡直接獲取Bitmap private Bitmap getDiskBitmap(String pathString) { Bitmap bitmap = null; try { File file = new File(pathString); if (file.exists()) { bitmap = BitmapFactory.decodeFile(pathString); } } catch (Exception e) { // TODO: handle exception } return bitmap; }
// 轉換成64位的Bitmap public static String bitmapToBase64(Bitmap bitmap) { String result = null; ByteArrayOutputStream baos = null; try { if (bitmap != null) { baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); baos.flush(); baos.close(); byte[] bitmapBytes = baos.toByteArray(); result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (baos != null) { baos.flush(); baos.close(); } } catch (IOException e) { e.printStackTrace(); } } return result; }
// 裁剪 public static Bitmap imageCrop(Bitmap bitmap, int num1, int num2, boolean isRecycled) { if (bitmap == null) { return null; } int w = bitmap.getWidth(); // 得到圖片的寬,高 int h = bitmap.getHeight(); int retX, retY; int nw, nh; if (w > h) { if (h > w * num2 / num1) { nw = w; nh = w * num2 / num1; retX = 0; retY = (h - nh) / 2; } else { nw = h * num1 / num2; nh = h; retX = (w - nw) / 2; retY = 0; } } else { if (w > h * num2 / num1) { nh = h; nw = h * num2 / num1; retY = 0; retX = (w - nw) / 2; } else { nh = w * num1 / num2; nw = w; retY = (h - nh) / 2; retX = 0; } } Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null, false); if (isRecycled && bitmap != null && !bitmap.equals(bmp) && !bitmap.isRecycled()) { bitmap.recycle();// 回收原圖片 bitmap = null; } return bmp; }
private void encode() { File file = new File(Environment.getExternalStorageDirectory(),"famous_bitmap_painting.jpg"); try { if (file.exists()) { file.delete(); } file.createNewFile(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String imgPath = getIntent().getStringExtra("famousPicturePath"); //圖片的地址imgBitmapPath String imgBitmapPath = file.getPath().toString(); try { ImageUtils.createImageThumbnail(getApplicationContext(), imgPath, imgBitmapPath, 500, 100); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //bitmap ---createImageThumbnail工具類裁剪後處理後的圖片
Bitmap bitmap = getDiskBitmap(imgBitmapPath); if (bitmap != null) {
//bitmap ---imageCrop類裁剪後處理後的圖片
Bitmap bitmap2 = imageCrop(bitmap, 500, 500, false); search_img.setImageBitmap(bitmap2);
//bitmap 轉成---64位字節
String base64 = bitmapToBase64(bitmap); } }
2. 重點是這個工具類,其中大部分無用的,有用的可以直接
public class ImageUtils { public final static String SDCARD_MNT = "/mnt/sdcard"; public final static String SDCARD = "/sdcard"; /** 請求相冊 */ public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0; /** 請求相機 */ public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1; /** 請求裁剪 */ public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2; public static final int REQUEST_CODE_GETIMAGE_IMAGEPAVER = 3; /** * 寫圖片文件 在Android系統中,文件保存在 /data/data/PACKAGE_NAME/files 目錄下 * * @throws IOException */ public static void saveImage(Context context, String fileName, Bitmap bitmap) throws IOException { saveImage(context, fileName, bitmap, 100); } public static void saveImage(Context context, String fileName, Bitmap bitmap, int quality) throws IOException { if (bitmap == null || fileName == null || context == null) return; FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, quality, stream); byte[] bytes = stream.toByteArray(); fos.write(bytes); fos.close(); } /** * 寫圖片文件到SD卡 * * @throws IOException */ public static void saveImageToSD(Context ctx, String filePath, Bitmap bitmap, int quality) throws IOException { if (bitmap != null) { File file = new File(filePath.substring(0, filePath.lastIndexOf(File.separator))); if (!file.exists()) { file.mkdirs(); } BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(filePath)); bitmap.compress(CompressFormat.JPEG, quality, bos); bos.flush(); bos.close(); if (ctx != null) { scanPhoto(ctx, filePath); } } } public static void saveBackgroundImage(Context ctx, String filePath, Bitmap bitmap, int quality) throws IOException { if (bitmap != null) { File file = new File(filePath.substring(0, filePath.lastIndexOf(File.separator))); if (!file.exists()) { file.mkdirs(); } BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(filePath)); bitmap.compress(CompressFormat.PNG, quality, bos); bos.flush(); bos.close(); if (ctx != null) { scanPhoto(ctx, filePath); } } } /** * 讓Gallery上能馬上看到該圖片 */ private static void scanPhoto(Context ctx, String imgFileName) { Intent mediaScanIntent = new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File file = new File(imgFileName); Uri contentUri = Uri.fromFile(file); mediaScanIntent.setData(contentUri); ctx.sendBroadcast(mediaScanIntent); } /** * 獲取bitmap * * @param context * @param fileName * @return */ public static Bitmap getBitmap(Context context, String fileName) { FileInputStream fis = null; Bitmap bitmap = null; try { fis = context.openFileInput(fileName); bitmap = BitmapFactory.decodeStream(fis); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } finally { try { fis.close(); } catch (Exception e) { } } return bitmap; } /** * 獲取bitmap * * @param filePath * @return */ public static Bitmap getBitmapByPath(String filePath) { return getBitmapByPath(filePath, null); } public static Bitmap getBitmapByPath(String filePath, BitmapFactory.Options opts) { FileInputStream fis = null; Bitmap bitmap = null; try { File file = new File(filePath); fis = new FileInputStream(file); bitmap = BitmapFactory.decodeStream(fis, null, opts); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } finally { try { fis.close(); } catch (Exception e) { } } return bitmap; } /** * 獲取bitmap * * @param file * @return */ public static Bitmap getBitmapByFile(File file) { FileInputStream fis = null; Bitmap bitmap = null; try { fis = new FileInputStream(file); bitmap = BitmapFactory.decodeStream(fis); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } finally { try { fis.close(); } catch (Exception e) { } } return bitmap; } /** * 使用當前時間戳拼接一個唯一的文件名 * * @param format * @return */ public static String getTempFileName() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SS"); String fileName = format.format(new Timestamp(System .currentTimeMillis())); return fileName; } /** * 獲取照相機使用的目錄 * * @return */ public static String getCamerPath() { return Environment.getExternalStorageDirectory() + File.separator + "FounderNews" + File.separator; } /** * 判斷當前Url是否標准的content://樣式,如果不是,則返回絕對路徑 * * @param uri * @return */ public static String getAbsolutePathFromNoStandardUri(Uri mUri) { String filePath = null; String mUriString = mUri.toString(); mUriString = Uri.decode(mUriString); String pre1 = "file://" + SDCARD + File.separator; String pre2 = "file://" + SDCARD_MNT + File.separator; if (mUriString.startsWith(pre1)) { filePath = Environment.getExternalStorageDirectory().getPath() + File.separator + mUriString.substring(pre1.length()); } else if (mUriString.startsWith(pre2)) { filePath = Environment.getExternalStorageDirectory().getPath() + File.separator + mUriString.substring(pre2.length()); } return filePath; } /** * 通過uri獲取文件的絕對路徑 * * @param uri * @return */ @SuppressWarnings("deprecation") public static String getAbsoluteImagePath(Activity context, Uri uri) { String imagePath = ""; String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.managedQuery(uri, proj, // Which columns to // return null, // WHERE clause; which rows to return (all rows) null, // WHERE clause selection arguments (none) null); // Order-by clause (ascending by name) if (cursor != null) { int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.getCount() > 0 && cursor.moveToFirst()) { imagePath = cursor.getString(column_index); } } return imagePath; } /** * 獲取圖片縮略圖 只有Android2.1以上版本支持 * * @param imgName * @param kind * MediaStore.Images.Thumbnails.MICRO_KIND * @return */ @SuppressWarnings("deprecation") public static Bitmap loadImgThumbnail(Activity context, String imgName, int kind) { Bitmap bitmap = null; String[] proj = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DISPLAY_NAME }; Cursor cursor = context.managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj, MediaStore.Images.Media.DISPLAY_NAME + "='" + imgName + "'", null, null); if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) { ContentResolver crThumb = context.getContentResolver(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 1; // bitmap = MethodsCompat.getThumbnail(crThumb, cursor.getInt(0), // kind, options); } return bitmap; } public static Bitmap loadImgThumbnail(String filePath, int w, int h) { Bitmap bitmap = getBitmapByPath(filePath); return zoomBitmap(bitmap, w, h); } /** * 獲取SD卡中最新圖片路徑 * * @return */ public static String getLatestImage(Activity context) { String latestImage = null; String[] items = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; Cursor cursor = context.managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, items, null, null, MediaStore.Images.Media._ID + " desc"); if (cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor .moveToNext()) { latestImage = cursor.getString(1); break; } } return latestImage; } /** * 計算縮放圖片的寬高 * * @param img_size * @param square_size * @return */ public static int[] scaleImageSize(int[] img_size, int square_size) { if (img_size[0] <= square_size && img_size[1] <= square_size) return img_size; double ratio = square_size / (double) Math.max(img_size[0], img_size[1]); return new int[] { (int) (img_size[0] * ratio), (int) (img_size[1] * ratio) }; } /** * 創建縮略圖 * * @param context * @param largeImagePath * 原始大圖路徑 * @param thumbfilePath * 輸出縮略圖路徑 * @param square_size * 輸出圖片寬度 * @param quality * 輸出圖片質量 * @throws IOException */ public static void createImageThumbnail(Context context, String largeImagePath, String thumbfilePath, int square_size, int quality) throws IOException { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = 1; // 原始圖片bitmap Bitmap cur_bitmap = getBitmapByPath(largeImagePath, opts); if (cur_bitmap == null) return; // 原始圖片的高寬 int[] cur_img_size = new int[] { cur_bitmap.getWidth(), cur_bitmap.getHeight() }; // 計算原始圖片縮放後的寬高 int[] new_img_size = scaleImageSize(cur_img_size, square_size); // 生成縮放後的bitmap Bitmap thb_bitmap = zoomBitmap(cur_bitmap, new_img_size[0], new_img_size[1]); // 生成縮放後的圖片文件 saveImageToSD(null, thumbfilePath, thb_bitmap, quality); } /** * 放大縮小圖片 * * @param bitmap * @param w * @param h * @return */ public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) { Bitmap newbmp = null; if (bitmap != null) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidht = ((float) w / width); float scaleHeight = ((float) h / height); matrix.postScale(scaleWidht, scaleHeight); newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); } return newbmp; } public static Bitmap scaleBitmap(Bitmap bitmap) { // 獲取這個圖片的寬和高 int width = bitmap.getWidth(); int height = bitmap.getHeight(); // 定義預轉換成的圖片的寬度和高度 int newWidth = 200; int newHeight = 200; // 計算縮放率,新尺寸除原始尺寸 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 創建操作圖片用的matrix對象 Matrix matrix = new Matrix(); // 縮放圖片動作 matrix.postScale(scaleWidth, scaleHeight); // 旋轉圖片 動作 // matrix.postRotate(45); // 創建新的圖片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return resizedBitmap; } /** * (縮放)重繪圖片 * * @param context * Activity * @param bitmap * @return */ public static Bitmap reDrawBitMap(Activity context, Bitmap bitmap) { DisplayMetrics dm = new DisplayMetrics(); context.getWindowManager().getDefaultDisplay().getMetrics(dm); int rHeight = dm.heightPixels; int rWidth = dm.widthPixels; // float rHeight=dm.heightPixels/dm.density+0.5f; // float rWidth=dm.widthPixels/dm.density+0.5f; // int height=bitmap.getScaledHeight(dm); // int width = bitmap.getScaledWidth(dm); int height = bitmap.getHeight(); int width = bitmap.getWidth(); float zoomScale; /** 方式3 **/ if (width >= rWidth) zoomScale = ((float) rWidth) / width; else zoomScale = 1.0f; // 創建操作圖片用的matrix對象 Matrix matrix = new Matrix(); // 縮放圖片動作 matrix.postScale(zoomScale, zoomScale); Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); return resizedBitmap; } /** * 將Drawable轉化為Bitmap * * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, width, height); drawable.draw(canvas); return bitmap; } /** * 獲得圓角圖片的方法 * * @param bitmap * @param roundPx * 一般設成14 * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** * 獲得帶倒影的圖片方法 * * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } /** * 將bitmap轉化為drawable * * @param bitmap * @return */ public static Drawable bitmapToDrawable(Bitmap bitmap) { Drawable drawable = new BitmapDrawable(bitmap); return drawable; } /** * 獲取圖片類型 * * @param file * @return */ public static String getImageType(File file) { if (file == null || !file.exists()) { return null; } InputStream in = null; try { in = new FileInputStream(file); String type = getImageType(in); return type; } catch (IOException e) { return null; } finally { try { if (in != null) { in.close(); } } catch (IOException e) { } } } /** * 獲取圖片的類型信息 * * @param in * @return * @see #getImageType(byte[]) */ public static String getImageType(InputStream in) { if (in == null) { return null; } try { byte[] bytes = new byte[8]; in.read(bytes); return getImageType(bytes); } catch (IOException e) { return null; } } /** * 獲取圖片的類型信息 * * @param bytes * 2~8 byte at beginning of the image file * @return image mimetype or null if the file is not image */ public static String getImageType(byte[] bytes) { if (isJPEG(bytes)) { return "image/jpeg"; } if (isGIF(bytes)) { return "image/gif"; } if (isPNG(bytes)) { return "image/png"; } if (isBMP(bytes)) { return "application/x-bmp"; } return null; } private static boolean isJPEG(byte[] b) { if (b.length < 2) { return false; } return (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8); } private static boolean isGIF(byte[] b) { if (b.length < 6) { return false; } return b[0] == 'G' && b[1] == 'I' && b[2] == 'F' && b[3] == '8' && (b[4] == '7' || b[4] == '9') && b[5] == 'a'; } private static boolean isPNG(byte[] b) { if (b.length < 8) { return false; } return (b[0] == (byte) 137 && b[1] == (byte) 80 && b[2] == (byte) 78 && b[3] == (byte) 71 && b[4] == (byte) 13 && b[5] == (byte) 10 && b[6] == (byte) 26 && b[7] == (byte) 10); } private static boolean isBMP(byte[] b) { if (b.length < 2) { return false; } return (b[0] == 0x42) && (b[1] == 0x4d); } /** * */ public static String getImagePath(Uri uri, Activity context) { String[] projection = { MediaColumns.DATA }; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columIndex = cursor.getColumnIndexOrThrow(MediaColumns.DATA); String ImagePath = cursor.getString(columIndex); cursor.close(); return ImagePath; } return uri.toString(); } static Bitmap bitmap = null; /** * 2014年8月13日 * * @param uri * @param context * E-mail:[email protected] */ public static Bitmap loadPicasaImageFromGalley(final Uri uri, final Activity context) { String[] projection = { MediaColumns.DATA, MediaColumns.DISPLAY_NAME }; Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columIndex = cursor.getColumnIndex(MediaColumns.DISPLAY_NAME); if (columIndex != -1) { new Thread(new Runnable() { @Override public void run() { try { bitmap = android.provider.MediaStore.Images.Media .getBitmap(context.getContentResolver(), uri); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } cursor.close(); return bitmap; } else return null; } public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen) { return rotateAndScale(b, degrees, maxSideLen, true); } public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen, boolean recycle) { // if (null == b || degrees == 0 && b.getWidth() <= maxSideLen + 10 && b.getHeight() <= maxSideLen + 10) { // return b; // } Matrix m = new Matrix(); if (degrees != 0) { m.setRotate(degrees); } // float scale = Math.min(maxSideLen / b.getWidth(), maxSideLen / b.getHeight()); // if (scale < 1) { // m.postScale(scale, scale); // } try { Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true); if (null != b2 && b != b2) { if (recycle) { b.recycle(); } b = b2; } } catch (OutOfMemoryError e) { } return b; } public static Bitmap decodeByteArrayUnthrow(byte[] data, BitmapFactory.Options opts) { try { return BitmapFactory.decodeByteArray(data, 0, data.length, opts); } catch (Throwable e) { } return null; } public static boolean saveBitmap2file(Bitmap bmp, File file, Bitmap.CompressFormat format, int quality) { if (file.isFile()) file.delete(); OutputStream stream = null; try { stream = new FileOutputStream(file); } catch (FileNotFoundException e) { return false; } return bmp.compress(format, quality, stream); } /* * 視頻錄制所需工具類 */ public static List<Camera.Size> getResolutionList(Camera camera) { Parameters parameters = camera.getParameters(); List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); return previewSizes; } public static class ResolutionComparator implements Comparator<Camera.Size>{ @Override public int compare(Size lhs, Size rhs) { if(lhs.height!=rhs.height) return lhs.height-rhs.height; else return lhs.width-rhs.width; } } }
Android中使用開源框架android-image-indicator實現圖片輪播部署,之前的博文中有介紹關於圖片輪播的實現方式,分別為(含超鏈接): 1、《Andr
Android 博客園客戶端 (五) 查看評論、搜索博主,android查看評論項目地址:https://github.com/ZhangTingkuo/AndroidC
[Android]OkHttp的簡單封裝-輔助框架 序言 OkHttp 的強大算是毋庸置疑了;OkHttp 基本在網絡層能完成任何事情,適用任何情況;正因為如此 OkH
Android開源項目分類匯總(六)工具庫 主要包括那些不錯的開發庫,包括依賴注入框架、圖片緩存、網絡相關、數據庫ORM建模、Android公共庫、Android 高版本