美文网首页
Android 图片的裁剪(神奇的Glide)

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

作者: 努尔江 | 来源:发表于2021-08-05 13:17 被阅读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++
                }
            }
    
    

    完。

    相关文章

      网友评论

          本文标题:Android 图片的裁剪(神奇的Glide)

          本文链接:https://www.haomeiwen.com/subject/kejmvltx.html