木桶布局 原理与实现

2023-10-27

项目中有一些图片布局需要按木桶布局排列,而前端工程师是个新手,不会用JS实现,只能在后端处理,直接返回处理好的图片尺寸,达到木桶布局的效果。
木桶布局就是将图片按行、等高排列,并且保证每一行图片排列正好占满,边距相等,效果如下:
这里写图片描述
实现木桶布局的图片尺寸处理主要有以下步骤:
1、设置行高、行宽、边距
2、获取图片高、宽
3、将每个图片高度设置为行高,并等比例缩放图片宽度
4、遍历图片尺寸数组,从第一个图片开始,累计图片宽度,并将图片放入一个数组,当加上第n+1个图片的宽度后,累计宽度与行宽的差大于行高,从第n+1个图片开始重新累计图片宽度,并重新第n+1个开始放入新的数组中,以此获取多个包含着若干图片宽度之和与行宽相近的数组,将它们整成二维数组以便下一步处理。
5、将预处理好的二维数组,再次遍历,先计算图片处理后的宽度之width和与行宽row_width之比ratio,再用行高row_height与该ratio相除,获取等比例width等比例缩小成row_width得到的图片高度height,这个height就是图片实际应该设置的高,接下来按height通过等比例缩放来获取图片实际应该设置的宽度img_width,并更新原数组中的宽度。
6、处理后的数组就差不多是可实现木桶布局的图片尺寸了,但由于之前的计算中,由于可能浮点数运算然后四舍五入导致出现误差,所有还需要矫正一下,累计每一个图片组的宽度之和,计算与行宽的误差over_width,然后通过为每组最后一个图片增减over_width,矫正误差。
上面步骤主要是为了讲解原理,所以分了好几次遍历来进行不同处理,实际代码实现时,可以合并处理步骤。
下面是我写的一个demo源码:

......
//artimages 是图片数组
foreach($artimages as $k=>$artimage){
            if(!empty($artimage['production'])){
                $tmp['url'] = $artimage['url'];
                $tmp['id'] = $artimage['id'];
                list($tmp['w'],$tmp['h'])=getimagesize(storage_path('app').'/'.$artimage['path']);
                array_push($image_arr,$tmp);
            }
        }

        foreach($image_arr as $k=>$image){
            $image_arr[$k]['w'] = intval($image['w'] * (300/number_format($image['h'],2,'.','')));
            $image_arr[$k]['h'] = intval($row_height);
        }

        $result = [];
        $tmp_width = 0;
        $i = 0;
        foreach($image_arr as $k=>$image){
            if($row_width < ($tmp_width + $image['w'] + $space_width)){
                if(abs($row_width - ($tmp_width + $image['w'] + $space_width)) > $row_height){

                    $count = count($result[$i]);//一组图片数量
                    //当前组图片累计的宽度 与 预设行宽 之比
                    $ratio = number_format(($tmp_width-$count*$space_width)/($row_width-($count+1)*$space_width),2,'.','');

                    /*
                     * 调整该组图片应设行高
                     */
                    $tmp_height = intval(300 / $ratio);
                    $width = 0;
                    foreach( $result[$i] as $index => $val){
                        $result[$i][$index]['h'] = $tmp_height;
                        $result[$i][$index]['w'] = intval($val['w'] * ($tmp_height / $val['h']));
                        $width += $result[$i][$index]['w'] + $space_width;
                    }

                    $over_width = $row_width - intval($width + $space_width);//当前行宽误差
                    $result[$i][$index]['w'] += $over_width;//消除误差
                    $tmp_width = 0;
                    $i ++;//接下来的图放入下行
                }
            }
            $result[$i][] = $image;
            $tmp_width += $image['w'] + $space_width;//记录新宽度

        }
        return $result;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

木桶布局 原理与实现 的相关文章

  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • WordPress 中的 add_action 函数

    嗯 我正在学习创建一个 WordPress 插件 我下载了一个并阅读了代码 然后我看到了这个 我假设 foo 是它将添加操作的标签 但是 array 到底是做什么的呢 add action foo array foo1 foo2 我在看ht
  • Zend Framework 生成唯一的字符串

    我想生成一个唯一的 4 6 个字符长的字母数字字符串 以便与每个记录 用户 一起保存在数据库中 db 字段具有唯一索引 因此尝试保存预先存在的字符串会生成错误 现在我正在生成一个随机字符串并使用 try catch 因此在添加新记录时如果抛
  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • PHP严格标准:声明应该兼容

    我有以下类层次结构 class O Base class O extends O Base abstract class A Abstract public function save O Base obj class A extends
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 将“php”作为 shell 脚本执行时的自定义 php.ini 文件

    我在跑php作为 shell 脚本 我不确定 shell脚本 是否正确 该文件以 usr bin php 这很好用 但 MongoDB 类没有正确加载php ini文件 具有extension mongo so 未使用 我该如何使用它tha
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 覆盖控制器 Symfony 3.4/4.0

    我目前正在尝试覆盖 FOSUserBundle 中的控制器 在新的文档中 https symfony com doc 3 4 bundles override html https symfony com doc 3 4 bundles o
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 为什么 Composer 降级了我的包?

    php composer phar update这样做了 删除了 2 3 0 软件包并安装了整个 2 2 5 Zend Framework php composer phar update Loading composer reposito
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行

    前言 本篇博文是使用 32 位的 MinGW 在 Windows 下编译 OpenCV 生成 32 位的 dll 关于使用 64 位的 MinGW 编译 OpenCV 生成 64 位的 dll 见 OpenCV使用CMake和MinGW w
  • Spark基础概念

    概念 Spark 提供了一个全面 统一的框架用于管理各种有着不同性质 文本数据 图表数据等 的数据集和数据源 批量数据或实时的流数据 的大数据处理的需求 核心架构 Spark Core 包含Spark 的基本功能 尤其是定义RDD 的API
  • google v8使用示例

    概念解释 Handle V8里使用Handle类型来托管 JavaScript对象 与C 的std shared pointer类似 Handle类型间的赋值均是直接传递对象引用 但不同的是 V8使用自己的GC来管理对象生命周期 而不是智能
  • 【转载】CSS3之Clip(裁剪)拓展阅读

    Clip属性是大家经常会误解的一个属性 这篇文章帮助大家充分的了解和学习clip属性 用这个属性制作出更好的效果 我可以确定Clip属性有很多同学并不知道 因为这个属性使用率非常的底 我初次接触是在Drupal的主题之中 他们有一段用来隐藏
  • 人才管理是什么意思_复合型人才是什么意思(复合型人才八种能力)

    有人经常会这样想 自己专业性知识很扎实 可为啥还是找不到满意的工作 原文来自www 777n com 复合型人才 自媒体www 777n com 对 一个优秀的企业在决定是否录用你 考虑的肯定不只是一点 学历 专业知识 工作经验等等方面 企
  • ios post上传文件到服务器,iOS 使用Post方法上传文件或图片

    在iOS开发中使用POST请求上传文件分为三步 1 设置请求行 NSURL url NSURL URLWithString NSString stringWithFormat 2 设置post请求 post请求抽出到NSMutableURL
  • 比较两个set是否相等?(C++)

    假设有两个set如下 include
  • Python中数据类型和变量的使用

    常用数据类型 计算机能处理的远远不止数值 还可以处理文本 图形 音频 视频 网页等各种各样的数据 而处理不同的数据 需要使用不同的数据类型来进行表示 数字型 整型 int 浮点型 float 复数 complex 布尔型 bool 只有两个
  • Ubuntu 安装 Samba 服务器

    1 Ubuntu 安装 Samba 服务器 确认安装 dpkg l grep samba 安装 sudo apt get install samba samba common 卸载 sudo apt get autoremove samba
  • 【YOLOv7/v5系列算法改进NO.46】融合DLinkNet模型中协同双注意力机制CDAM2

    文章目录 前言 一 解决问题 二 基本原理 三 改进办法 前言 作为当前先进的深度学习目标检测算法YOLOv7 已经集合了大量的trick 但是还是有提高和改进的空间 针对具体应用场景下的检测难点 可以不同的改进方法 此后的系列文章 将重点
  • 保证分布式系统数据一致性的6种方案

    原文 http weibo com ttarticle p show id 2309403965965003062676 问题的起源 在电商等业务中 系统一般由多个独立的服务组成 如何解决分布式调用时候数据的一致性 具体业务场景如下 比如一
  • 解决pycharm中unresolved reference ‘ ’无法导入工程中的包的问题

    跑一篇论文中的代码 一直有错误 显示无法导入包 明明我的导入的包都在工程中 但当我在main py中添加trainers包时 from trainers import 会出现这种错误 经过改正 有两种方法解决 一 将 py文件全部移出src
  • 【JavaEE】多线程(二)

    多线程 二 文章目录 多线程 二 第一个多线程程序 观察线程 sleep 创建线程 继承Thread类 重写run方法 实现Runnable 重写run 继承Thread 重写run 实现Runnable 重写run 基于lambda表达式
  • 内存卡数据删除了怎么恢复?sd卡数据恢复,3个步骤找回

    sd卡就是常见的内存卡 它作为数据的存储设备之一 通常用来保存照片 音频 视频等数据 但是因为误删除或者格式化原因把里面的数据删除了怎么办 让小编来告诉你sd卡数据恢复的方法 无须再为sd卡数据丢失而烦恼了 一 sd卡数据丢失的原因 在恢复
  • 中文文本摘要提取 (文本摘要提取 有代码)基于python

    任务简介 文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要 文本摘要按照输入类型可分为单文档摘要和多文档摘要 单文档摘要从给定的一个文档中生成摘要 多文档摘要从给定的一组主题相关的文档中生成摘要 按照输出类型可分为抽取式摘要和生成式
  • 在QWidget中使用QML的控件,举一个例子

    好的 在 QWidget 中使用 QML 的控件 你需要使用 Qt Quick 的 QQuickWidget 控件 下面是一个例子 include
  • UE4 C++ 位移枚举类型

    UE4中的移位枚举 枚举经常被序列化并存储为int 一般UE4中的枚举为uint8
  • Java 补全两个年份之间缺失的年份\计算两个日期相差年数

    计算两个日期相差年数 public static int yearDateDiff Date startDate Date endDate Calendar calBegin Calendar getInstance 获取日历实例 Cale
  • mysql远程同步数据表_关于MYSQL的远程数据库表间同步的构思与测试

    关于MYSQL的远程数据库表间同步的构思与测试 前沿 由于业务需求 客户需要同步一个数据库部分表到另外一台服务器上 使用mysql日志复制方案行不通 只能从mysql触发器 mysql的 federated引擎来解决 第一 打开Mysql的
  • 木桶布局 原理与实现

    项目中有一些图片布局需要按木桶布局排列 而前端工程师是个新手 不会用JS实现 只能在后端处理 直接返回处理好的图片尺寸 达到木桶布局的效果 木桶布局就是将图片按行 等高排列 并且保证每一行图片排列正好占满 边距相等 效果如下 实现木桶布局的