Android 图片的裁剪(神奇的Glide)

2021-08-05  本文已影响0人  努尔江

效果图:


效果图
  1. 需求背景:
    从服务器拿到宽度很长的一张图,多个图横向拼接(中间有白色分割线)。要加载其中的一张。

  2. 探索:
    设置ImageView的ScaleType为CenterCrop。如果图片是拼接三张,会加载第二章,如果图片是两张拼接,那么效果是第一章的右边50%,第二张的左边50%。效果很差。

3.实现思路:
转换成Bitmap,获取高宽。按照宽度方向和高度进行像素的走查。如果1个柱子内的全部颜色像素为白色(R:255,G:255,B:255)那么这个是分界线。


思路.png
  1. 实现:
    从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++
            }
        }

完。

上一篇下一篇

猜你喜欢

热点阅读