图片无缝拼接

前段时间做需求一直被一个问题困扰,就是banner图无缝拼接的兼容问题,尤其在一些大屏手机上很容易复现这个问题。

于是各种搜索,期望能找到解决办法,然而网上提供的诸如给img设置display:block;添加vertical-align:top;的方法完全解决不了问题。

下面提供一个自己摸索出来的方法,供大家参考,如果大家有更好的方法,或者清楚其原理的,欢迎交流学习!

 

bug复现图

bug描述:

如上图:可以看到banner图被切成了2张,拼接的地方有一条线;通常图片拼接有缝的时候,我们会想到一个简单暴力的方法,给下面的图片设置margin-top:-1px;但是这个图不适用,会导致图片衔接处有明显的变形;

于是我在电脑模拟器上手动调试图片的高度,起初我认为让图片自适应宽度的时候,高度auto,不同的机型解析高度,可能为小数导致的。实则不然,因为手机解析为小数,浏览器最终还是会取整。因此不是浏览器解析的问题,也不是机型像素差异的问题。既然高度是整数为什么还会有缝?这个图的实际高度是544px,我手动改为400px,发现缝竟然没了,于是我1像素1像素调整,发现遇到4的整倍数的时候,缝就会消失。

于是,我用js代码获取图片高度,判断当高度不为4的倍数的时候,把高度加高为4的整倍数,尝试后发现在能复现bug的手机上,问题解决了。

但是个别手机,快速拖动图片或者手动强制放大屏幕的时候还是可以看到这个缝。但是正常的用户正常的浏览页面的时候,问题可以说基本是上是解决了。

bug说明:

当页面banner过长需要切成2张,或者一个主要由图片拼接而成的静态页面。在一些大屏手机上(如小米mix2、ipad等),可以明显的看到拼接的2张图之间有一条缝隙。

 

尝试过的解决方案:

1、2个div之间无margin,banner图作为div的背景图进行拼接,示例页面使用的是这种布局方法;结果:仍然有一条缝

2、banner图使用img元素,img转块将父元素撑开,父元素之间无padding、margin、border等,审查元素父盒子被img撑开,高度与img高度一致;结果:页面仍然有一条缝

3、使用vertical-align:top/text-top属性处理img元素,使之在父元素中置顶显示;结果:页面仍然有一条缝

可行的解决方案:

1、当图片拼接出现缝隙的时候,检查png格式切图是否有问题,可能png图片顶部有空白导致的;

2、当拼接的2张图片之间颜色一致时,使用margin-top:-1px的方法,此法简单粗暴,使用css即可解决问题

3、当页面图片色彩丰富切精细无法用方法2解决时,使用js,获取图片渲染后的高度,将高度设置为4的整倍数;此时图片之间的衔接就不会有缝隙了,并且不会存在明显的图片变形。

参考文章:https://blog.csdn.net/s12244315/article/details/48825037

 

下面是方案3代码:(粘上我的源码,仅供参考)

tips:

1、必须在图片onload之后才能获取到图片的高度,否则为0;

2、图片onload之后不要获取地址中的图片高度,要获取dom渲染后的图片自适应高度

3、如果图片的高度不是4的整倍数,重新赋值

 

转载于:https://www.cnblogs.com/qiujianmei/p/9285773.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一个计算机视觉库,可用于处理数字图像和视频。其中一个可以实现任意方向图片拼接的功能是图像拼接(Stitching)模块。 图像拼接是将多个图像组合成一个更大的图像的过程。OpenCV的Stitching模块可以自动识别出多幅图像中重叠的区域,并将它们无缝地连接起来,形成一个完整的图像。此外,该模块还可以自动矫正图像的旋转、缩放和透视畸变,从而使拼接后的图像更为真实和自然。 在OpenCV中实现任意方向的图像拼接,需要使用拼接模块提供的API函数。首先,我们需要读取要拼接的多张图像,并将它们存储在一个 Mat类型的数组中。然后,我们可以调用拼接模块的 Stitcher类,并为其设置合适的参数,如拼接算法类型、拼接范围等。最后,我们调用Stitcher类的stitch()函数来进行拼接拼接后的图像将保存在一个名为result的Mat对象中。 使用OpenCV进行图像拼接的过程虽然简单,但对于不同类型、分辨率或拍摄角度的图像,需要进行不同的处理和调整,从而达到最佳的拼接效果。因此,在进行图像拼接时,建议仔细阅读OpenCV的官方文档,并进行实验和调试,以获得最佳的拼接效果。 ### 回答2: OpenCV是一款常用的图像处理库,其提供了丰富的图像处理函数和工具,包括对图像进行拼接的函数。而任意方向图片拼接,主要指的是在不同的方向上(如横向、竖向、斜向等)将多张图片进行平滑的拼接,以形成一张完整的大图。 要实现这样的任意方向图片拼接,可以借助OpenCV的cv::Stitcher函数。这个函数可以自动将多张图片拼接成一张完整的大图,同时还支持对图像进行自动校准,以消除因相机移动或角度不同而导致的图像错位问题。 使用cv::Stitcher函数进行任意方向图片拼接的基本步骤如下: 1. 加载需要拼接图片,将其存储在一个vector容器中。 2. 创建cv::Stitcher对象,设置拼接模式和相关参数。 3. 调用cv::Stitcher的拼接函数,对图片进行拼接拼接完成后,会得到一张完整的大图。 4. 对拼接后的大图进行后处理,如裁剪、调整颜色和光照等。 需要注意的是,任意方向图片拼接虽然能够实现很好的图像拼接效果,但在具体操作中可能会受到一些限制。例如,在拍摄时需要采用固定的拍摄角度、相机高度和相机间距等条件,以保证拼接后的图像具有更好的连贯性和一致性。 因此,在实际应用中,需要根据具体场景和需求,结合OpenCV提供的各种图像处理工具,选择合适的拼接方式,来实现任意方向的图片拼接。 ### 回答3: OpenCV是一个用于计算机视觉和图像处理的开源库。该库包含一系列的函数和算法,用于处理图像、视频和其他多媒体应用程序开发。其中,任意方向图片拼接就是一种应用场景。 在 OpenCV 中进行任意方向图片拼接的基本思路是将所有的图片进行特征提取、匹配和拼接。在这个过程中,需要涉及到一些基础算法,如:矩阵运算、SIFT、SURF、ORB 等算法。 具体地,任意方向图片拼接可以分为以下几个步骤: 1. 加载所有待拼接图片。 2. 对于每张图片,通过 SIFT、SURF、ORB 等算法提取其关键点和描述符。 3. 对于两张图片,通过匹配算法(如 FLANN、KNN、简单匹配等)确定两张图片中的相似点。 4. 对于所有的相似点,通过矩阵变换进行映射,将这些点从一张图片映射到另一张图片中。 5. 最后,通过拼接算法(如直接拼接、基于蒙太奇的拼接等)进行拼接,得到最终的拼接结果。 需要注意的是,在进行任意方向图片拼接时,需要考虑到图片中可能存在的变形、旋转、缩放等因素,这需要通过拼接时的参数设置进行调整。 总之,OpenCV 提供了丰富的函数和算法,可以实现任意方向图片拼接,同时还可以通过参数调整等手段提高拼接的精度和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值