{"id":15820478,"url":"https://github.com/baotlake/screenshot-splicing","last_synced_at":"2025-09-05T05:31:41.199Z","repository":{"id":43532336,"uuid":"406385147","full_name":"baotlake/screenshot-splicing","owner":"baotlake","description":"Python滚动截长图的简单算法实现，由视频读帧计算滚动距离并拼接长图。  支持反向滚动、水平滚动，支持预估和跳帧。","archived":false,"fork":false,"pushed_at":"2022-07-17T07:45:21.000Z","size":38332,"stargazers_count":6,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-12T07:08:58.733Z","etag":null,"topics":["ffmpeg","python","screenshots","stitcher","video"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baotlake.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-14T13:47:12.000Z","updated_at":"2024-06-23T02:46:09.000Z","dependencies_parsed_at":"2022-07-10T16:32:33.118Z","dependency_job_id":null,"html_url":"https://github.com/baotlake/screenshot-splicing","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/baotlake/screenshot-splicing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baotlake%2Fscreenshot-splicing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baotlake%2Fscreenshot-splicing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baotlake%2Fscreenshot-splicing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baotlake%2Fscreenshot-splicing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baotlake","download_url":"https://codeload.github.com/baotlake/screenshot-splicing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baotlake%2Fscreenshot-splicing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273716238,"owners_count":25155205,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ffmpeg","python","screenshots","stitcher","video"],"created_at":"2024-10-05T07:01:42.595Z","updated_at":"2025-09-05T05:31:36.172Z","avatar_url":"https://github.com/baotlake.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# screenshot-splicing\n\nPython滚动截长图的简单算法实现，由视频读帧计算滚动距离并拼接长图。\n\n支持反向滚动、水平滚动，支持预测和跳帧，核心代码 \u003c 200行\n\n## 安装依赖\n```shell\n# ffmpeg-python, numpy, pillow, click\n\npip install numpy pillow ffmpeg-python click\n\n# ffmpeg (https://ffmpeg.org/)\n\napt install ffmpeg\n```\n\n## 用法\n```sh\n./splicing --help\n./splicing ../examples/a.mp4\n```\n\n## Jupyter Notebook\n\n[Datalore 在线演示](https://datalore.jetbrains.com/notebook/gsUTxNo1FoaYJjYVp7QWQd/yPRZBJpUVjuA46Amn1pR7S/)\n\n[screen-splicing.ipynb](./screen-splicing.ipynb)\n\n## ❇️ core\n算法的一些主要函数实现\n\n### 1️⃣ col_sampling(img_array: np.ndarray, cols_group=None) \n列采样函数, 由一个图片矩阵中选取并处理几列的数据并返回。\n\n`img_array`: 灰度图片（矩阵）\n\n`cols_group`: 自定义采样策略， 例如：\n- cols_group=[[1]] - 只取第1列\n- cols_group=[[1,5],[6,9]] - 分别取第1，5列和第6，9列的平均值\n\n\n\n### 2️⃣ predict_offset(max: int, p: int)\n根据预测值生成一个偏移值列表\n\n`max`: 最大的滚动距离绝对值\n\n`p`: 预测的滚动距离（offset）\n\n例如滚动范围是`(-100, 100)`（`max=100`）, 预测的滚动距离是`50`(`p=50`)。\n\n则返回的列表是`[50, 51, 49, 52, 48, ...]`\n\n也就是由预测值开始，向预测值左右依次比较\n\n\n### 3️⃣ diff_overlap(cols: np.ndarray, col2: np.ndarray, predict=0, approx_diff=0.2, min_overlap=220)\n\n`cols`, `cols2`:  是由采样函数`col_sampling`对图片采样结果\n\n`predict`: 预测的滚动距离\n\n`approx_diff`: 可以接受的差异值，比较差异时小于该值返回\n\n`min_overlap`: 可接受的最小重叠高度（px）\n\n\n若平均差小于设定的 `approx_diff` 则准备跳出循环,跳出循环前，再比较最后10次（目的在与让拼接位置更准确一点）。\n\n\n### 4️⃣ predict(history: list, idea_offset)\n该函数实现了预测和丢帧的策略。\nlist 是一个之前几次计算结果的列表，\n每次的计算结果由一个元组表示，例如(2, 30, 0.1111) 表示第2帧，滚动距离30px，\n平均绝对差异值为0.1111。\nidea_offset 表示期望的滚动距离，假设我期望的滚动距离是300px, 而根据之前的结果，\n每帧滚动了90px, 那么可以计算到，距离达到期望的滚动距离还有3.3帧，\n那就可以丢2帧，假设滚动是线性的（这几帧的滚动距离也是每帧90px），\n那么预测的滚动距离就是270px。\n\n\n### calc_overlaps\n\n\n### splice\n\n# ▶️ splicing.py\n调用core.py提供的关键函数，进行实际拼接。\n可分为如下3部分：\n1. FFmpeg视频读帧\n2. 调用 core.py 计算重合位置\n3. 拼接长图\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaotlake%2Fscreenshot-splicing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaotlake%2Fscreenshot-splicing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaotlake%2Fscreenshot-splicing/lists"}