Android 图片的裁剪(神奇的Glide)
2021-08-05 本文已影响0人
努尔江
效果图:
效果图
-
需求背景:
从服务器拿到宽度很长的一张图,多个图横向拼接(中间有白色分割线)。要加载其中的一张。 -
探索:
设置ImageView的ScaleType为CenterCrop。如果图片是拼接三张,会加载第二章,如果图片是两张拼接,那么效果是第一章的右边50%,第二张的左边50%。效果很差。
3.实现思路:
转换成Bitmap,获取高宽。按照宽度方向和高度进行像素的走查。如果1个柱子内的全部颜色像素为白色(R:255,G:255,B:255)那么这个是分界线。
思路.png
- 实现:
从Bitmap入手,核心代码
//如果是本地Bitmap,可以imageView.getDrawable().toBitmap() 也是可以的。
lateinit var bitmapList:MutableList<Bitmap>
Glide.with(this)
.asBitmap()
.load("https://cdn.modesens.cn/blog/20210710-1.png")
.listener(object :RequestListener<Bitmap>{
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Bitmap>?,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Bitmap?,
model: Any?,
target: Target<Bitmap>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
//判断资源是否准备好
if (resource!=null){
//获取Bitmap的宽高。
val w=resource.width
val h=resource.height
val list= mutableListOf<Int>()
var start=0
//从1到Bitmap宽度为方向。
for (x:Int in 1 until w){
//是否白色
var yes: Boolean
//从高度1到Bitmap的高度.
for (y:Int in 1 until h){
//获取单个像素.
val pixel=resource.getPixel(x,y)
//进行比较。如果值接近于白色。
yes = pixel.red>250 && pixel.blue>250 && pixel.green>250
if (y==h-1 && yes){
仅仅获取第一次出现的x点,所以忽略连续出现的x
if (start+1!=x){
list.add(x)
}
start=x
}
}
}
//可能会重复执行,所以先必须清空。
bitmapList.clear()
if (list.isNotEmpty()){
for (i:Int in 0 until list.size){
val bitmap:Bitmap
if (i==0){
bitmap=Bitmap.createBitmap(resource,0,0,list[0],resource.height)
}else if (i==list.size-1){
bitmap=Bitmap.createBitmap(resource,list[i],0,resource.width-list[i],resource.height)
}else{
bitmap=Bitmap.createBitmap(resource,list[i-1],0,list[i]-list[i-1],resource.height)
}
bitmapList.add(bitmap)
}
}
//按钮的点击事件
btn.setOnClickListener {
imageView.setImageBitmap(bitmapList[position])
if (position==bitmapList.size-1){
position=0
}else{
position++
}
}
完。