Glide的图像centerCrop处理-长短边适配
Glide的圖像適配Imageview提供了兩種寫(xiě)好的模式centerCrop,fitCenter。
在看代碼時(shí)出現(xiàn)了一些疑惑,就是TransformationUtils這個(gè)類(lèi)中的centerCrop方法,看代碼
這個(gè)方法就是將bitmap裁剪成一個(gè)指定大小的bitmap。這個(gè)方法里面的解析網(wǎng)上有了,整體看下來(lái)好像也沒(méi)什么問(wèn)題,就是在計(jì)算縮放值的時(shí)候,有點(diǎn)不懂了
if (toCrop.getWidth() * height > width * toCrop.getHeight()) { //為什么這個(gè)判斷條件下是用高去做縮放scale = (float) height / (float) toCrop.getHeight();dx = (width - toCrop.getWidth() * scale) * 0.5f;} else {scale = (float) width / (float) toCrop.getWidth();dy = (height - toCrop.getHeight() * scale) * 0.5f;}在toCrop.getWidth() * height > width * toCrop.getHeight()這個(gè)條件下為什么是用高計(jì)算縮放值。
這里我們簡(jiǎn)化下,我們拿到的需要裁剪的一張圖大小的寬為tW,高為tH,需要適配的圖像寬高是W,H。
那么上面的公式就變成tW *H > W * tH。在這個(gè)條件下用高縮放,想了好久沒(méi)明白,不知所云。
這樣寫(xiě)肯定是有理由的,找了好久終于找到答案了,就是這么一段話
關(guān)于長(zhǎng)短邊:“長(zhǎng)邊”是指原尺寸與目標(biāo)尺寸的比值大的那條邊,“短邊”同理。例如,原圖400x200,縮放為 800x100,由于 400/800=0.5,200/100=2,0.5 < 2,所以在這個(gè)縮放中 200 那條是長(zhǎng)邊,400 那條是短邊。
就是圖像處理的長(zhǎng)短邊問(wèn)題,上面用的就是短邊去適配,所以上面的公式轉(zhuǎn)換下就是tW / W > tH/H,看到這里再結(jié)合長(zhǎng)短邊的概念就明白了,這里需要注意的是短邊是打了引號(hào)的,并不是長(zhǎng)度的短,而是在比值中的“短”。
弄明白這個(gè)條件的意思,問(wèn)題又來(lái)了,為什么用短邊去計(jì)算縮放大小,
是因?yàn)橛枚踢吶ミm配的縮放值肯定要小于長(zhǎng)邊的縮放值,這樣能保證,要裁剪的圖片的短邊跟目標(biāo)圖的邊大小一樣,而長(zhǎng)邊的縮放之后不會(huì)小于目標(biāo)邊的長(zhǎng)度。
舉個(gè)例子,要裁剪的圖大小18 * 8,目標(biāo)圖的大小6 * 4 ,(18/6 =3 ) > (8/4 = 2),這個(gè)時(shí)候應(yīng)該用短邊8去適配,也就是8縮小成4,長(zhǎng)邊18頁(yè)就變成9,也就變成了一個(gè)9 * 4的圖像然后這樣按centerCrop去裁剪成6 * 4就不會(huì)留白了。畫(huà)個(gè)圖就明白了
上圖的1.5就是centerCrop方法里面的dx表示平移的偏移量,也就是
最后調(diào)用 canvas.drawBitmap(toCrop, m, paint);就能畫(huà)出一個(gè)裁剪后的的目標(biāo)圖了,整個(gè)方法就做了兩件事,先縮放原圖,然后裁剪繪制,這里也不是真正的裁剪,只是在繪制的時(shí)候先偏移了一定的長(zhǎng)度,導(dǎo)致繪制的區(qū)域超出了,我們只能看見(jiàn)在目標(biāo)區(qū)bitmap內(nèi)的圖像,類(lèi)似裁剪的意思。
這里主要是要意識(shí)到圖片處理的長(zhǎng)短邊適配的概念。隨便了解下centCrop的過(guò)程及原理。
寫(xiě)完之后才發(fā)覺(jué)時(shí)間飛逝~,一天又沒(méi)了
總結(jié)
以上是生活随笔為你收集整理的Glide的图像centerCrop处理-长短边适配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 又一个基于 Esbuild 的神器!es
- 下一篇: 前端学习(3045):vue+eleme