diff --git a/.github/workflows/pack_img.yaml b/.github/workflows/pack_img.yaml index 6cf996e..2c0587c 100644 --- a/.github/workflows/pack_img.yaml +++ b/.github/workflows/pack_img.yaml @@ -7,18 +7,25 @@ on: pull_request: branches: - main # 当对 main 分支创建 PR 时触发 -permissions: - contents: write # 允许对代码库的写入权限 + workflow_dispatch: + jobs: run-script: + permissions: + contents: write # 允许对代码库的写入权限 + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest # 使用最新的 Ubuntu 运行环境 steps: - name: Checkout repository - uses: actions/checkout@v3 # 检出当前仓库代码 + uses: actions/checkout@v4 # 检出当前仓库代码 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.x' # 设置 Python 版本 @@ -29,26 +36,14 @@ jobs: - name: Run image stitching script run: | - python auto_pack_img.py # 运行你的 Python 脚本(替换为你的脚本文件名) + mkdir images + ./auto_pack_img.py - - name: Save stitched image as artifact - uses: actions/upload-artifact@v3 + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 with: - name: auto_img_zh_cn # 上传生成的图片作为 artifact - path: auto_img_zh_cn.png # 替换为你生成图片的路径 + path: images - - name: Save stitched image as artifact - uses: actions/upload-artifact@v3 - with: - name: auto_img_en # 上传生成的图片作为 artifact - path: auto_img_en.png # 替换为你生成图片的路径 - - name: Commit and push updated file - run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git add auto_img_zh_cn.png # 添加你想要提交的文件 - git add auto_img_en.png - git commit -m "Update file with new data" - git push origin main # 推送更改回 main 分支 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 使用 GitHub 提供的 Token 推送更改 + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index e9d4be5..50c4e21 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,17 @@ # mcmeme 欢迎各位提交[Pull Request](https://github.com/LIPiston/mcmeme/pulls)来扩展这张图 -![](latest.png) Pull Request的时候提交小图即可 大图太容易冲突了 -## 自动生成的大图 -![](auto_img_zh_cn.png) -![](auto_img_en.png) [QQ群](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=GSK0q5Be9BtgPh-7UDEgw1XUc9eNlb_E&authKey=s54nZ9lIbjETFV2sQj65vJHoH04tg%2Bst%2FB%2Fo0WgVTyRGo%2BxL0ZPw8%2BHX3oNnr%2FIo&noverify=0&group_code=810025413) +![](latest.png) + +## 自动生成的大图 +![](https://lipiston.github.io/mcmeme/auto_img_zh_cn.png) +![](https://lipiston.github.io/mcmeme/auto_img_en.png) + ## 梦开始的地方 ### 原创 diff --git a/auto_img.png b/auto_img.png deleted file mode 100644 index 0dcf4e3..0000000 Binary files a/auto_img.png and /dev/null differ diff --git a/auto_img_en.png b/auto_img_en.png deleted file mode 100644 index 8e3fdde..0000000 Binary files a/auto_img_en.png and /dev/null differ diff --git a/auto_img_zh_cn.png b/auto_img_zh_cn.png deleted file mode 100644 index e6d68a9..0000000 Binary files a/auto_img_zh_cn.png and /dev/null differ diff --git a/auto_pack_img.py b/auto_pack_img.py old mode 100644 new mode 100755 index 99bfc15..fed8abf --- a/auto_pack_img.py +++ b/auto_pack_img.py @@ -1,135 +1,136 @@ -import random - -import cv2 -import numpy as np -import os - - -class Node: - def __init__(self, x, y, width, height): - self.x = x - self.y = y - self.width = width - self.height = height - self.used = False - self.right = None - self.down = None - - -def find_node(root, width, height): - if root.used: - return find_node(root.right, width, height) or find_node(root.down, width, height) - elif width <= root.width and height <= root.height: - return root - else: - return None - - -def split_node(node, width, height): - node.used = True - node.down = Node(node.x, node.y + height, node.width, node.height - height) - node.right = Node(node.x + width, node.y, node.width - width, height) - return node - - -def grow_node(root, width, height): - can_grow_down = (width <= root.width) - can_grow_right = (height <= root.height) - - should_grow_right = can_grow_right and (root.height >= (root.width + width)) - should_grow_down = can_grow_down and (root.width >= (root.height + height)) - - if should_grow_right: - return grow_right(root, width, height) - elif should_grow_down: - return grow_down(root, width, height) - elif can_grow_right: - return grow_right(root, width, height) - elif can_grow_down: - return grow_down(root, width, height) - else: - root.width=root.width+width//2 - root.height=root.height+height//2 - return grow_node(root, width, height) - - -def grow_right(root, width, height): - new_root = Node(0, 0, root.width + width, root.height) - new_root.used = True - new_root.down = root - new_root.right = Node(root.width, 0, width, root.height) - return new_root if find_node(new_root, width, height) else None - - -def grow_down(root, width, height): - new_root = Node(0, 0, root.width, root.height + height) - new_root.used = True - new_root.right = root - new_root.down = Node(0, root.height, root.width, height) - return new_root if find_node(new_root, width, height) else None - - -def stitch_images_bin_packing(images): - - root = Node(0, 0, images[0].shape[1], images[0].shape[0]) - - positions = [] - - for img in images: - node = find_node(root, img.shape[1], img.shape[0]) - if node: - split_node(node, img.shape[1], img.shape[0]) - else: - root = grow_node(root, img.shape[1], img.shape[0]) - node = find_node(root, img.shape[1], img.shape[0]) - split_node(node, img.shape[1], img.shape[0]) - positions.append((node.x, node.y)) - - - # stitched_image = np.zeros((root.height, root.width, 3), dtype=np.uint8) - stitched_image = np.full((root.height, root.width, 3),255, dtype=np.uint8) - - - for pos, img in zip(positions, images): - x, y = pos - stitched_image[y:y + img.shape[0], x:x + img.shape[1]] = img - - return stitched_image - - - -def load_images_from_folder(folder,max_height=768,max_width=768): - images = [] - for filename in os.listdir(folder): - img = cv2.imread(os.path.join(folder, filename)) - if img is not None: - if max_height is not None and max_width is not None: - if img.shape[0] > max_height or img.shape[1] > max_width: - scw=img.shape[1]/max_width - sch=img.shape[0]/max_height - mac=max(scw,sch) - img = cv2.resize(img, (int(img.shape[1]//mac),int(img.shape[0]//mac))) - # img = cv2.resize(img, (min(img.shape[1], max_width), min(img.shape[0], max_height))) - # img = cv2.resize(img, (min(img.shape[1], max_width), min(img.shape[0], max_height))) - images.append(img) - random.shuffle(images) - return images - - - -folder = 'zh_cn' -images = load_images_from_folder(folder) - -stitched_image = stitch_images_bin_packing(images) - - -cv2.imwrite('auto_img_zh_cn.png', stitched_image) - - -folder = 'en' -images = load_images_from_folder(folder) - -stitched_image = stitch_images_bin_packing(images) - - -cv2.imwrite('auto_img_en.png', stitched_image) +#!/usr/bin/env python3 +import random + +import cv2 +import numpy as np +import os + + +class Node: + def __init__(self, x, y, width, height): + self.x = x + self.y = y + self.width = width + self.height = height + self.used = False + self.right = None + self.down = None + + +def find_node(root, width, height): + if root.used: + return find_node(root.right, width, height) or find_node(root.down, width, height) + elif width <= root.width and height <= root.height: + return root + else: + return None + + +def split_node(node, width, height): + node.used = True + node.down = Node(node.x, node.y + height, node.width, node.height - height) + node.right = Node(node.x + width, node.y, node.width - width, height) + return node + + +def grow_node(root, width, height): + can_grow_down = (width <= root.width) + can_grow_right = (height <= root.height) + + should_grow_right = can_grow_right and (root.height >= (root.width + width)) + should_grow_down = can_grow_down and (root.width >= (root.height + height)) + + if should_grow_right: + return grow_right(root, width, height) + elif should_grow_down: + return grow_down(root, width, height) + elif can_grow_right: + return grow_right(root, width, height) + elif can_grow_down: + return grow_down(root, width, height) + else: + root.width=root.width+width//2 + root.height=root.height+height//2 + return grow_node(root, width, height) + + +def grow_right(root, width, height): + new_root = Node(0, 0, root.width + width, root.height) + new_root.used = True + new_root.down = root + new_root.right = Node(root.width, 0, width, root.height) + return new_root if find_node(new_root, width, height) else None + + +def grow_down(root, width, height): + new_root = Node(0, 0, root.width, root.height + height) + new_root.used = True + new_root.right = root + new_root.down = Node(0, root.height, root.width, height) + return new_root if find_node(new_root, width, height) else None + + +def stitch_images_bin_packing(images): + + root = Node(0, 0, images[0].shape[1], images[0].shape[0]) + + positions = [] + + for img in images: + node = find_node(root, img.shape[1], img.shape[0]) + if node: + split_node(node, img.shape[1], img.shape[0]) + else: + root = grow_node(root, img.shape[1], img.shape[0]) + node = find_node(root, img.shape[1], img.shape[0]) + split_node(node, img.shape[1], img.shape[0]) + positions.append((node.x, node.y)) + + + # stitched_image = np.zeros((root.height, root.width, 3), dtype=np.uint8) + stitched_image = np.full((root.height, root.width, 3),255, dtype=np.uint8) + + + for pos, img in zip(positions, images): + x, y = pos + stitched_image[y:y + img.shape[0], x:x + img.shape[1]] = img + + return stitched_image + + + +def load_images_from_folder(folder,max_height=768,max_width=768): + images = [] + for filename in os.listdir(folder): + img = cv2.imread(os.path.join(folder, filename)) + if img is not None: + if max_height is not None and max_width is not None: + if img.shape[0] > max_height or img.shape[1] > max_width: + scw=img.shape[1]/max_width + sch=img.shape[0]/max_height + mac=max(scw,sch) + img = cv2.resize(img, (int(img.shape[1]//mac),int(img.shape[0]//mac))) + # img = cv2.resize(img, (min(img.shape[1], max_width), min(img.shape[0], max_height))) + # img = cv2.resize(img, (min(img.shape[1], max_width), min(img.shape[0], max_height))) + images.append(img) + random.shuffle(images) + return images + + + +folder = 'zh_cn' +images = load_images_from_folder(folder) + +stitched_image = stitch_images_bin_packing(images) + + +cv2.imwrite('images/auto_img_zh_cn.png', stitched_image) + + +folder = 'en' +images = load_images_from_folder(folder) + +stitched_image = stitch_images_bin_packing(images) + + +cv2.imwrite('images/auto_img_en.png', stitched_image) diff --git a/latest.png b/latest.png deleted file mode 100644 index 48ae800..0000000 Binary files a/latest.png and /dev/null differ