編輯:關於Android編程
本文實例總結了Android編程之圖片相關代碼。分享給大家供大家參考,具體如下:
1. Bitmap轉化為字符串:
/** * @param 位圖 * @return 轉化成的字符串 */ public static String bitmapToString(Bitmap bitmap) { // 將Bitmap轉換成字符串 String string = null; ByteArrayOutputStream bStream = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.PNG, 100, bStream); byte[] bytes = bStream.toByteArray(); string = Base64.encodeToString(bytes, Base64.DEFAULT); return string; }
2.字符串轉化為Bitmap:
/** * @param string 字符串 * @return 轉化成的位圖 */ public static Bitmap stringToBitmap(String string) { // 將字符串轉換成Bitmap類型 Bitmap bitmap = null; try { byte[] bitmapArray; bitmapArray = Base64.decode(string, Base64.DEFAULT); bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length); } catch (Exception e) { e.printStackTrace(); } return bitmap; }
3.Bitmap轉化為Drawable:
/** * @param bitmap Bitmap位圖圖像 * @return Drawable 轉換後的Drawable對象 */ public static Drawable bitmapToDrawable(Bitmap bitmap) { if (bitmap == null) return null; if (160 != bitmap.getDensity()) { bitmap.setDensity(160); } return new BitmapDrawable(bitmap); }
根據圖片資源ID獲取Drawable對象:
/** * @param context 上下文 * @param id 圖片的資源ID * @return Drawable對象 */ public static Drawable resourceToDrawable(Context context,int id) { return null == context ? null : bitmapToDrawable(BitmapFactory.decodeResource(context.getResources(), id)); }
byte數組轉換Drawble對象:
/** * @param bytes byte數組 * @return drawble對象 */ public static Drawable byteArrayToDrawable(byte[] bytes) { return null == bytes ? null : bitmapToDrawable(BitmapFactory.decodeByteArray(bytes, 0, bytes.length)); }
4.Drawable轉化為bitmap:
/** * Drawble對象轉Bitmap對象 * @param drawable drawble對象 * @return bitmap對象 */ public static Bitmap drawableToBitmap(Drawable drawable) { return null == drawable ? null : ((BitmapDrawable) drawable).getBitmap(); }
5.byte數組轉換Bitmap對象:
/** * @param bytes byte數組 * @return bitmap對象 */ public static Bitmap byteArrayToBitmap(byte[] bytes) { return null == bytes ? null : BitmapFactory.decodeByteArray(bytes, 0, bytes.length); }
6.圖片去色,返回灰度圖片(老式圖片):
/** * @param bitmap 傳入的bitmap * @return 去色後的圖片Bitmap對象 */ public static Bitmap toGrayscale(Bitmap bitmap) { int width,height; height = bitmap.getHeight(); width = bitmap.getWidth(); Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas c = new Canvas(bmpGrayscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); c.drawBitmap(bitmap, 0, 0, paint); return bmpGrayscale; }
7.對圖片進行縮放:
/** * @param url 圖片的路徑 * @param requireSize 縮放的尺寸 * @return 縮放後的圖片Bitmap對象 */ public static Bitmap getScaleImage(String url,int requireSize) { BitmapFactory.Options o = new BitmapFactory.Options(); // 此屬性表示圖片不加載到內存,只是讀取圖片的屬性,包括圖片的高寬 o.inJustDecodeBounds = true; BitmapFactory.decodeFile(url, o); int width_tmp = o.outWidth,height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < requireSize || height_tmp / 2 < requireSize) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap bmp = BitmapFactory.decodeFile(url, o2); return bmp; }
8.獲得圖片的倒影,同時倒影漸變效果:
/** * @param bitmap 圖片源 * @return 處理後的圖片Bitmap對象 */ public static Bitmap createMirro(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int shadow_height = 15; int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); // shadow effect int alpha = 0x00000000; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int index = y * width + x; int r = (pixels[index] >> 16) & 0xff; int g = (pixels[index] >> 8) & 0xff; int b = pixels[index] & 0xff; pixels[index] = alpha | (r << 16) | (g << 8) | b; } if (y >= (height - shadow_height)) { alpha = alpha + 0x1F000000; } } // invert effect Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); for (int y = 0; y < height; y++) { bm.setPixels(pixels, y * width, width, 0, height - y - 1, width, 1); } return Bitmap.createBitmap(bm, 0, 0, width, shadow_height); }
9.保存圖片到SDCard:
/** * @param imagePath 圖片保存路徑 * @param bm 被保存的bitmap對象 */ public static void saveImgToLocal(String imagePath, Bitmap bm) { if (bm == null || imagePath == null || "".equals(imagePath)) { return; } File f = new File(imagePath); if (f.exists()) { return; } else { try { File parentFile = f.getParentFile(); if (!parentFile.exists()) { parentFile.mkdirs(); } f.createNewFile(); FileOutputStream fos; fos = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); } catch (FileNotFoundException e) { f.delete(); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); f.delete(); } } }
10.從SDCard中獲取圖片:
/** * @param imagePath 圖片在SDCard中保存的路徑 * @return 返回保存的bitmap對象 */ public static Bitmap getImageFromLocal(String imagePath) { File file = new File(imagePath); if (file.exists()) { Bitmap bitmap = BitmapFactory.decodeFile(imagePath); file.setLastModified(System.currentTimeMillis()); return bitmap; } return null; }
11.圖片壓縮處理:
/** * 對圖片進行壓縮,主要是為了解決控件顯示過大圖片占用內存造成OOM問題。 * 一般壓縮後的圖片大小應該和用來展示它的控件大小相近。 * @param context 上下文 * @param resId 圖片資源Id * @param reqWidth 期望壓縮的寬度 * @param reqHeight 期望壓縮的高度 * @return 壓縮後的圖片 */ public static Bitmap compressBitmapFromResourse(Context context, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); /* * 第一次解析時,inJustDecodeBounds設置為true, * 禁止為bitmap分配內存,雖然bitmap返回值為空,但可以獲取圖片大小 */ options.inJustDecodeBounds = true; BitmapFactory.decodeResource(context.getResources(), resId, options); final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } options.inSampleSize = inSampleSize; //使用計算得到的inSampleSize值再次解析圖片 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(context.getResources(), resId, options); }
12. 獲取可用內存的最大值(App使用內存超出這個值會引起OutOfMemory異常):
private int getMaxMemoryForApp() { int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); return maxMemory; }
13.將圖片裁剪成圓圈:
/** * 將Bitmap處理為圓形的圖片 * @param bitmap 處理之前的位圖 * @return 處理之後的位圖 */ public static Bitmap circlePic(Bitmap bitmap){ int width = bitmap.getWidth(); int height = bitmap.getHeight(); int r = width < height ? width/2:height/2;//圓的半徑,取寬和高中較小的,以便於顯示沒有空白 Bitmap outBitmap = Bitmap.createBitmap(r*2, r*2, Bitmap.Config.ARGB_8888);//創建一個剛好2r大小的Bitmap Canvas canvas = new Canvas(outBitmap); final int color =0xff424242; final Paint paint = new Paint(); /** * 截取圖像的中心的一個正方形,用於在原圖中截取 * 坐標如下: * 1.如果 w < h , 左上坐標(0, (h-w)/2) , 右上坐標(w, (h+w)/2) 偏移10 * 2.如果 w > h , 左上坐標((w-h)/2, 0) , 右上坐標((w+h)/2, h) 偏移10 */ final Rect rect = new Rect( width < height ? 0 : (width-height)/2, width < height ? (height-width)/2 - 10 : -10, width < height ? width : (width+height)/2, (width < height ? (height+width)/2 - 10: height - 10)); //創建一個直徑大小的正方形,用於設置canvas的顯示與設置畫布截取 final Rect rect2 = new Rect( 0, 0, r*2, r*2); //提高精度,用於消除鋸齒 final RectF rectF = new RectF(rect2); //下面是設置畫筆和canvas paint.setAntiAlias(true); canvas.drawARGB(0,0,0,0); paint.setColor(color); //設置圓角,半徑都為r,大小為rect2 canvas.drawRoundRect(rectF, r, r, paint); //設置圖像重疊時的顯示方式 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); //繪制圖像到canvas canvas.drawBitmap(bitmap, rect, rect2, paint); return outBitmap; } }
希望本文所述對大家Android程序設計有所幫助。
互聯網的發展是非常迅猛的,剛剛覺得自己適應了eclipse的用法,突然發現它已經被淘汰了。OK,今天不是來說eclipse和Android studio的褒貶。我們是來學
console是構建在stdio之上的,console的初始化是board_r中最後收尾的操作。console的初始化函數console_init_r在common/co
在上一文中,我們提到retrofit 2.0中如何實現非持久化cookie的兩種方案,但並未做過深的解釋。現在我們重點關注JavaNetCookieJar實現非持久化co
在Android開發中,我們經常會遇到流布式的布局,經常會用來一些標簽的顯示,比如qq中個人便簽,搜索框下方提示的詞語,這些是指都是流布式的布局,今天我就我們日常開放中遇