探索图片填充模式二--CenterCrop模式的实现
? ? 1. 圖片要去兩頭,留中間?
? ? 2. 圖片要填充滿控件
? 這個模式和fitCenter還有有很大的不同。借鑒上篇文章的思路,我們同樣按照Image與ImageView的寬高比差值,分兩種情況進行討論。
? 假設原始圖片高h,寬w , Imageview的高y,寬x ,比較兩者高寬比。裁剪出的圖稱為Image1:
? 1、 當 y / x - h / w > 0 時
? 說明Imageview的高寬比大于圖片的高寬比,如圖所示:
? 左圖實線標示的是圖片Image的高和寬,右圖是Imageview。 我們需要從Image的中間按照比例y/x裁剪出一幅圖Image1來,如圖中虛線所示。
? 顯而易見,Image1的寬度是w1,高度是h 。
? Image1的高寬比必須和Imageview的高寬比相同,即 y / x = h / w1 , 計算出 w1 = (h * x )/ y
? 在FitCenter模式中,我們需要計算Image在畫布上的繪制點。在CenterCrop模式中,都是裁剪操作,我們只需要計算在Image的什么地方進行裁剪。從圖上可以看出,裁剪點 ?P的坐標是((w - w1) / 2, 0)。
?2、當 y / x - h / w <= 0時
? 說明Imageview的高寬比小于圖片的高寬比,如圖所示:
? 顯而易見,Image1高度為h1, 寬度為w ,依據 y / x = h1 / w , 計算出 h1 = (w * y) / x
? 裁剪點P 的坐標是 (0, (h - h1) / 2)
? 好了,算法我們分析出來了。在Android中繪制圖片的某一個部分使用到了函數 Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
? source是原始圖片,x指的是繪制的橫坐標,y指的是繪制的縱坐標。width,height分別代表寬高。
? ?下面給出核心代碼實現:
/*** 以CenterCrop方式resize圖片* @param src 原始圖片* @param destWidth 目標圖片寬度* @param destHeight 目標圖片高度* @return*/ public Bitmap resizeBitmapByCenterCrop(Bitmap src, int destWidth, int destHeight) {if (src == null || destWidth == 0 || destHeight == 0) {return null;}// 圖片寬度int w = src.getWidth();// 圖片高度int h = src.getHeight();// Imageview寬度int x = destWidth;// Imageview高度int y = destHeight;// 高寬比之差int temp = (y / x) - (h / w);/*** 判斷高寬比例,如果目標高寬比例大于原圖,則原圖高度不變,寬度為(w1 = (h * x) / y)拉伸* 畫布寬高(w1,h),在原圖的((w - w1) / 2, 0)位置進行切割*/if (temp > 0) {// 計算畫布寬度int w1 = (h * x) / y;// 創建一個指定高寬的圖片Bitmap newb = Bitmap.createBitmap(src, (w - w1) / 2, 0, w1, h);//原圖回收src.recycle();return newb;} else {/*** 如果目標高寬比小于原圖,則原圖寬度不變,高度為(h1 = (y * w) / x),* 畫布寬高(w, h1), 原圖切割點(0, (h - h1) / 2)*/// 計算畫布高度int h1 = (y * w) / x;// 創建一個指定高寬的圖片Bitmap newb = Bitmap.createBitmap(src, 0, (h - h1) / 2, w, h1);//原圖回收src.recycle();return newb;} }??
? 效果圖:
? 附:Demo下載
?
? 原文鏈接:http://www.67tgb.com/?p=578
? 轉載注明:望月聽濤
總結
以上是生活随笔為你收集整理的探索图片填充模式二--CenterCrop模式的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【黑马程序员数据库】数据库基础大总结
- 下一篇: AUTOCAD——三种箭头的画法