桌面应用图像处理【免费下载链接】ImageGlass A fast, open-source, modern image viewer for 90 formats – including WEBP, GIF, SVG, AVIF, JXL, HEIC and more – built for smooth browsing across Windows, macOS, and Linux.项目地址https://gitcode.com/gh_mirrors/im/ImageGlass点击查看免费下载ImageGlass 是一款开源、跨平台Windows / macOS / Linux的高性能图片查看器支持 90 余种图片格式WEBP、GIF、SVG、AVIF、JXL、HEIC 及各类 RAW 格式。本文以仓库中 source/__assets/linux/flatpak/README.md 为骨架结合 Flatpak 清单manifest、AppStream 元数据、桌面启动项与打包脚本的源码实现完整讲解 ImageGlass 如何在 Linux 上以 Flatpak 形式构建、签名、分发并最终上架 Flathub。读完本文你将掌握如何从仓库源码产出可发布的.flatpak单文件 bundle 与 Flathub 清单引用的 tarball、如何通过 GitHub Releases 自助分发并做 GPG 签名、以及通过 Flathub 官方评审的全套流程。一、发行策略总览预编译二进制而非源码编译ImageGlass 的 Flatpak 发行方式有一个非常关键的设计决策manifest 安装的是预先构建好的publish-linux-x64二进制而不是在 Flathub 的构建机上现场编译源码。原因在 source/__assets/linux/flatpak/README.md 中说明得很清楚ImageGlass 基于 .NET 10 AOT 构建涉及 trimming 以及 SkiaSharp / HarfBuzz / Magick.NET 的原生互操作。在 Flathub 的构建器上离线完成这一整套原生编译与裁剪并不现实因此 manifest 直接下载一个带固定 sha256 校验的 release tarball。这也意味着每次发版都需要先在本地完成发布构建dotnet publish再把产物打成 tarball 交给 Flatpak。1.1 目录中的四个关键文件source/__assets/linux/flatpak/目录下维护了构建与分发 Flatpak 所需的全部静态文件文件用途io.github.d2phap.imageglass.yamlFlatpak manifest即提交给 Flathub 的构建定义io.github.d2phap.imageglass.metainfo.xmlAppStream 元数据Flathub 强制要求io.github.d2phap.imageglass.desktop桌面启动器条目io.github.d2phap.imageglass.svg/.png应用图标由打包脚本从__assets/logo_c.*生成其中.svg/.png两个图标并非手工维护而是打包脚本运行时从 source/__assets/logo_c.svg 和 source/__assets/logo_c_512.png 复制生成脚本中cp $WORKSPACE_DIR/__assets/logo_c.svg $FLATPAK_DIR/$APP_ID.svg的对应逻辑并以应用 IDio.github.d2phap.imageglass命名。1.2 构建脚本与 VS Code 任务打包脚本位于 source/__assets/linux/script-pack-linux-x64-flatpak.sh对应 VS Code 任务pack-linux-x64-flatpak。该脚本承担了从重新发布 AOT 构建到产出 tarball bundle的全部自动化工作后续章节会逐段拆解其实现。二、构建环境准备一次性操作在开始打包之前需要先安装 Flatpak 构建工具链并拉取与 manifest 中runtime-version一致的基础运行时。README 中给出的一次性命令如下# 一次性安装 sudo apt install flatpak-builder # 安装 freedesktop 运行时与 SDK版本须与 manifest 中的 25.08 一致 flatpak install -y flathub org.freedesktop.Platform//25.08 org.freedesktop.Sdk//25.08对应到 manifest source/__assets/linux/flatpak/io.github.d2phap.imageglass.yaml前四行正是app-id: io.github.d2phap.imageglass runtime: org.freedesktop.Platform runtime-version: 25.08 sdk: org.freedesktop.Sdk command: imageglassapp-id应用唯一标识同时被 desktop 文件、metainfo、图标名复用runtime/runtime-version基于 freedesktop 平台运行时 25.08 分支command: imageglass沙箱内启动入口对应桌面条目中的Execimageglass %F。注意打包脚本会自动从 manifest 中读取runtime-versionsed -n s/^runtime-version: .../ $MANIFEST并在运行时校验本机是否已安装对应版本的 Platform 与 Sdk若版本不匹配或未安装脚本会明确提示缺失并跳过 bundle 构建而不是静默失败。三、完整构建流程发布 → 打包 → 测试3.1 先发布再打包打包脚本依赖publish-linux-x64的产物。README 给出的标准流程是# 先执行发布任务VS Code task: publish-linux-x64然后 bash __assets/linux/script-pack-linux-x64-flatpak.sh实际上脚本内部会强制重新执行一次发布以确保产物与当前源码及版本一致——因为版本号被烘焙进二进制AppBuildInfo.g.cs如果直接打包一个过期的 publish 目录就会新版本号 旧代码。脚本中对应代码为dotnet publish $WORKSPACE_DIR/ImageGlass.Linux/ImageGlass.Linux.csproj \ -c Release -r linux-x64 -p:Platformx64 \ -p:PublishAottrue -p:PublishSingleFiletrue -p:PublishTrimmedtrue \ -o $PUBLISH_DIR --self-contained true这些参数与 source/ImageGlass.Linux/ImageGlass.Linux.csproj 中的项目属性一一对应PublishAot、PublishTrimmed、PublishSingleFile、SelfContained、PublishReadyToRun等目标是生成一份 linux-x64 的独立 AOT 单文件可执行程序。发布完成后脚本还会把 source/__assets/__app/ 下的运行时资源语言包、默认图片、主题等复制进发布目录并删除 Windows 专属的_ext_icons目录——那是一套用于 Windows 文件类型关联的图标在 Linux 上是约 14 MB 的纯冗余。版本号的来源在 source/Directory.Build.props脚本通过sed读取IgVersion与IgReleaseType组成发布标签REL_LABEL形如10.0.6.906若存在 release type 则为10.0.6.906-beta-2这类带后缀的标签后续所有产物命名、GitHub Release tag、manifest URL 都基于它。3.2 产物tarball 与 bundle构建完成后所有产物输出到__artifacts/bundle/ImageGlass_version_linux-x64.tar.gz—— Flathub manifest 所指向的 payload。tarball 内部使用单一顶层目录ImageGlass/以便 manifest 通过strip-components: 1解包同时排除*.dbg/*.pdb调试符号以减小体积。ImageGlass_version_linux-x64.flatpak—— 单文件 bundle用于直接下载安装。打包脚本在创建 tarball 后立即计算其 sha256并用sed把最新的url与sha256直接写回 manifestSHA256$(sha256sum $TARBALL_PATH | cut -d -f1) sed -i -E s#^( *)url: https://github.com/d2phap/ImageGlass/releases/download/.*#\1url: ${RELEASE_URL}# $MANIFEST sed -i -E s#^( *)sha256: [0-9a-f]{64}#\1sha256: ${SHA256}# $MANIFEST这正是 manifest 中url与sha256字段指向10.0.6.906版本 tarball 及其 64 位十六进制校验值能够保持仓库内可复现的原因——它们由脚本按发布标签自动更新发版时无需手工编辑。3.3 本地安装与冒烟测试脚本若检测到本机已安装flatpak-builder且运行时版本就绪会顺带完成两件事构建 bundle并把构建结果安装到当前用户的 flatpak 中方便直接测试flatpak run io.github.d2phap.imageglass ~/Pictures/some-image.jpg该命令以沙箱方式启动 ImageGlass 并传入图片路径参数。脚本在结束时会额外做一次系统级安装检查如果之前通过双击 bundle 的方式安装过那是系统级安装会提醒你旧的系统级安装会遮蔽刚装好的用户级构建需要先flatpak uninstall --system io.github.d2phap.imageglass才能确保测到的是新代码。3.4 脚本内两个值得注意的工程细节本地构建清单local manifestflatpak-builder 构建 bundle 时脚本会把 manifest 中的远程url源替换为本地path: app.tar.gz并删除不再适用的sha256行再配合--state-dir将构建缓存置于__artifacts/bundle/linux-flatpak/下避免污染仓库根目录。--disable-cache是必须的注释中明确警告——唯一模块是一个名字恒定app.tar.gz但内容随每次发版变化的本地 tarball。如果不加--disable-cacheflatpak-builder 会命中缓存的模块构建把旧二进制打进 bundle最终产出一个版本号是新、代码是旧的错误包--force-clean只清构建目录不清缓存。这是打包实践中最容易踩的坑脚本用注释与硬编码参数双重锁定。四、Flatpak 清单manifest逐段解读source/__assets/linux/flatpak/io.github.d2phap.imageglass.yaml 是 Flathub 上架的核心文件除运行时声明外还有两块内容finish-args沙箱权限与modules构建模块。4.1 finish-args沙箱权限逐条说明finish-args: - --socketx11 - --shareipc - --sharenetwork - --devicedri - --filesystemhost - --socketcups # Notification sound; also covers PipeWire hosts via pipewire-pulse. - --socketpulseaudio - --talk-nameorg.freedesktop.FileManager1 # Slideshow keeps the screen awake by resetting the session idle timer. - --talk-nameorg.freedesktop.ScreenSaver # Allow launching external tools on the host via flatpak-spawn --host. - --talk-nameorg.freedesktop.Flatpak权限作用--socketx11访问 X11 显示服务。ImageGlass 的 Linux 发布版在 source/ImageGlass.Linux/Program.cs 中通过.UseX11()固定使用 X11Wayland 走 XWayland故无需--socketwayland--shareipc与宿主共享 IPCX11 下必需--sharenetwork允许联网应用内更新检查、打开远程资源等--devicedriGPU 直通用于硬件加速渲染--filesystemhost授予全盘文件系统访问让 ImageGlass 可以打开/保存任意位置的图片--socketcups访问宿主 CUPS 打印服务--socketpulseaudio通知音播放兼容 PipeWire 的 pulseaudio 桥接--talk-nameorg.freedesktop.FileManager1与文件管理器通信实现在文件管理器中显示/选中文件--talk-nameorg.freedesktop.ScreenSaver重置会话空闲计时器幻灯片放映期间保持屏幕唤醒--talk-nameorg.freedesktop.Flatpak允许通过flatpak-spawn --host启动宿主机上的外部工具这些权限并非孤立声明都能在 Linux 平台的源码实现中找到对应消费方打印--socketcups对应 source/ImageGlass.Linux/Common/ServiceProviders/LinuxPrintProvider.cs。该实现通过BHelper.RunProcess(lpr, $-o fit-to-page \{fileToPrint}\)调用 CUPS 的lpr打印。注释特别说明选择lpr而非lp的原因Flatpak 运行时内置了lpr而没有lp两者都驱动 CUPS由 CUPS 自身套用图片滤镜文件管理器显示org.freedesktop.FileManager1对应 source/ImageGlass.Linux/Common/ServiceProviders/LinuxShellProvider.cs 中XdgPortal.ShowInFileManager(...)的调用在文件管理器中显示/查看属性功能防睡眠org.freedesktop.ScreenSaver对应同一文件里的PreventSleep / AllowSleep幻灯片放映场景外部工具org.freedesktop.Flatpak支持 ImageGlass 在沙箱内通过flatpak-spawn --host启动用户配置的外部编辑/处理程序source/ImageGlass.Lib/Tools/External/ 下的外部工具体系。4.2 modules打包布局modules: - name: imageglass buildsystem: simple build-commands: - install -d ${FLATPAK_DEST}/imageglass - cp -a payload/. ${FLATPAK_DEST}/imageglass/ - chmod x ${FLATPAK_DEST}/imageglass/ImageGlass - install -d ${FLATPAK_DEST}/bin - ln -s ../imageglass/ImageGlass ${FLATPAK_DEST}/bin/imageglass - install -Dm644 io.github.d2phap.imageglass.desktop ${FLATPAK_DEST}/share/applications/io.github.d2phap.imageglass.desktop - install -Dm644 io.github.d2phap.imageglass.metainfo.xml ${FLATPAK_DEST}/share/metainfo/io.github.d2phap.imageglass.metainfo.xml - install -Dm644 io.github.d2phap.imageglass.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/io.github.d2phap.imageglass.svg - install -Dm644 io.github.d2phap.imageglass.png ${FLATPAK_DEST}/share/icons/hicolor/512x512/apps/io.github.d2phap.imageglass.png sources: - type: archive url: https://github.com/d2phap/ImageGlass/releases/download/tag/ImageGlass_version_linux-x64.tar.gz sha256: 64位十六进制 strip-components: 1 dest: payload - type: file path: io.github.d2phap.imageglass.desktop - type: file path: io.github.d2phap.imageglass.metainfo.xml - type: file path: io.github.d2phap.imageglass.svg - type: file path: io.github.d2phap.imageglass.png几个值得注意的设计点整目录拷贝而非显式文件清单cp -a payload/. ${FLATPAK_DEST}/imageglass/把解包后的整个 payload 拷贝进/app/imageglass。manifest 中对此有专门注释——曾经因为使用显式文件清单导致后续新增的_lang语言包和default.webp被静默遗漏改为整体拷贝后tarball 在发布阶段已经裁剪完毕这里不会再丢资源dest: payload独立子目录archive 源被解压到独立的payload/子目录这样上面的整目录拷贝不会误把 manifest 同目录下的元数据文件desktop/metainfo/图标也一起复制进应用目录入口符号链接在/app/bin下创建指向/app/imageglass/ImageGlass的imageglass软链接与command: imageglass呼应图标双规格SVG 放入hicolor/scalablePNG 放入hicolor/512x512符合 hicolor 图标主题规范。五、桌面启动器与 AppStream 元数据5.1 Desktop Entrysource/__assets/linux/flatpak/io.github.d2phap.imageglass.desktop 定义了启动器条目核心字段如下[Desktop Entry] TypeApplication NameImageGlass CommentA Fast, Seamless Photo Viewer Execimageglass %F Iconio.github.d2phap.imageglass Terminalfalse CategoriesGraphics;Viewer; StartupWMClassImageGlass MimeTypeimage/jpeg;image/png;image/gif;image/bmp;image/tiff;image/svgxml;image/webp;image/avif;image/heic;image/heif;...Execimageglass %F%F字段码支持把文件管理器选中的一批图片一次性传给应用多文件打开注意 AppImage 场景下同样的入口是AppRun %F见 source/__assets/linux/appimage/README.md两者差异由打包形态决定MimeType声明了 JPEG、PNG、GIF、BMP、TIFF、SVG、WEBP、AVIF、HEIC/HEIF 以及各类 RAW 格式DNG、CR2/CR3、CRW、NEF、ARW、RW2、ORF、RAF、PEF 等与 PSD 的关联这正是 ImageGlass 90 格式支持在桌面层的外化StartupWMClassImageGlass让窗口管理器能把应用窗口与启动条目正确关联。5.2 AppStream 元数据source/__assets/linux/flatpak/io.github.d2phap.imageglass.metainfo.xml 是 Flathub 评审时必查的元数据文件包含id与应用 ID 一致launchable typedesktop-id指向桌面条目metadata_license为FSFAP元数据本身采用宽松许可project_license声明为GPL-3.0-or-laterGPLv3即 Flathub 页面上展示的许可证description描述应用定位快速、现代、开源支持 90 格式screenshots声明 4 张截图含默认截图README 特别提醒Flathub 会拒绝截图无法加载的提交因此上架前必须确保每个screenshot的imageURL 指向真实可达的 HTTPS 图片categoriesGraphics/Viewerkeywords、content_rating、recommends/supports一应俱全releases记录版本与发布日期。这份 metainfo 文件是与 AppImage 打包共享的source/__assets/linux/appimage/README.md 中明确说明它描述的是应用本身而非打包形态而 Flathub 是更严格的校验方一份文件同时约束两种打包能让两边的元数据都保持诚实。六、通过 GitHub Releases 自助分发如果不走 FlathubImageGlass 也支持自托管分发模式无需评审、发布后立即可用。具体做法是把两个产物上传到与 tag 匹配的 GitHub Release默认 tag 为vIgVersion对应的发布脚本内部默认使用RELEASE_TAGIgVersion[-IgReleaseType]不含v前缀可通过环境变量覆盖RELEASE_TAGtag上传ImageGlass_version_linux-x64.tar.gz与ImageGlass_version_linux-x64.flatpak两个文件。用户拿到 bundle 后直接安装即可flatpak install --user ImageGlass_version_linux-x64.flatpak6.1 可选 GPG 签名对单文件 bundle 来说签名是可选的——无论是否签名用户都能正常安装。但签名能提供来源校验。签名流程分两步① 一次性生成签名密钥gpg --quick-generate-key ImageGlass Release Signing default default never② 通过GPG_KEY环境变量把密钥传给打包脚本GPG_KEYyour-key-id-or-email bash __assets/linux/script-pack-linux-x64-flatpak.sh脚本内部的签名实现值得展开说明这正是可验证签名的关键细节签名分两层flatpak-builder构建 OSTree 仓库时用--gpg-signkey对 commit 签名flatpak build-bundle打包时除了--gpg-sign还追加--gpg-keys公钥文件把公钥一并嵌入 bundle为什么必须嵌入公钥脚本注释给出了答案没有--gpg-keys时用户执行flatpak install bundle.flatpak创建的 origin remote 没有任何可用来校验签名的公钥嵌入的签名等于无效容错设计若GPG_KEY未设置产出未签名 bundle若设置了但本机密钥环里没有对应的私钥注意 EV/代码签名证书是 X.509 格式不能用于 GPG脚本不中止tarball 已产出而是告警并回退为未签名 bundle并提示用gpg --quick-generate-key生成自己的密钥签名成功后脚本会建议发布方把密钥指纹公开gpg --fingerprint $GPG_KEY让用户能够核验信任链。七、上架 Flathub 的完整流程README 给出了提交 Flathub 的 5 个步骤以下结合仓库文件逐一说明第 1 步先发布 GitHub Release再提交 Flathub。因为 manifest 中的url字段必须真实可达Flathub 构建时会去下载该 tarball。打包脚本在发布阶段已经写入了与 release 匹配的url和sha256所以只需保证该 release 已上线即可。第 2 步检查截图。编辑 source/__assets/linux/flatpak/io.github.d2phap.imageglass.metainfo.xml确认每个screenshot的 URL 指向真实的 HTTPS 图片——Flathub 会拒绝截图加载失败的提交。第 3 步确认许可证声明。项目以GPL-3.0-or-laterGPLv3对外分发与仓库根目录 LICENSE 一致Flathub 页面将按此展示。第 4 步Fork Flathub 仓库并提交 PR。流程为forkflathub/flathub→ 在分支io.github.d2phap.imageglass上添加本目录中的 manifest 与元数据文件 → 对new-pr分支提交 Pull Request完整提交流程见 Flathub 官方 for-app-authors 文档。第 5 步等待评审与后续维护。这里有一个对独立开发者非常友好的点io.github.d2phap.*的应用 ID 是通过提交者的 GitHub 账号d2phap验证的无需域名所有权证明。通过后你会获得flathub/io.github.d2phap.imageglass仓库此后每次发版只需更新三处版本号、manifest 中的urlsha256、metainfo 中的release条目——前两者打包脚本已自动完成人工只需补release。八、沙箱权限的取舍与演进空间README 最后特别点明finish-args的授权思路当前授予了 Wayland/X11、GPUdri、全盘文件系统--filesystemhost、打印cups与在文件管理器中显示能力。其中全盘访问是刻意为之——图片查看器的核心场景就是打开/保存任意位置的图片受限的--filesystemhome会破坏打开任意路径的体验。同时 README 也预告了可能的收紧方向Flathub 评审方可能会要求把--filesystemhost收窄为--filesystemhome。这是 Flatpak 沙箱哲学中功能完整性 vs 最小权限的典型权衡也是 ImageGlass 后续若遇到 Flathub 评审意见时最可能被要求调整的一处。九、小结与实战清单综合 README 文档与仓库源码ImageGlass 的 Flatpak 发行体系可归纳为一条清晰的流水线版本源所有平台版本统一由 source/Directory.Build.props 的IgVersion/IgReleaseType驱动发布脚本执行dotnet publishlinux-x64、AOT、单文件、trimmed、self-contained补入__assets/__app运行时资源剔除 Windows 专属_ext_icons打 tarball单一ImageGlass/顶层目录、剔除调试符号、计算 sha256写回 manifestsed更新urlsha256保持 Flathub 清单自洽构建 bundle本地 local manifest --disable-cache防止旧二进制被缓存命中 可选 GPG 签名含嵌入公钥分发GitHub Releases 直发flatpak install --user安装 bundle或提交 Flathub截图、许可、PR 流程权限演进关注 Flathub 评审对--filesystemhost的收紧要求。对于希望在 Linux 上打包分发 ImageGlass 的开发者建议直接以 source/__assets/linux/script-pack-linux-x64-flatpak.sh 为模板它把发布 → 打包 → 签名 → 本地安装测试 → 输出清单全部固化唯一需要人工介入的只有上传 Release、补release条目与应对 Flathub 评审意见。赞分享桌面应用图像处理【免费下载链接】ImageGlass A fast, open-source, modern image viewer for 90 formats – including WEBP, GIF, SVG, AVIF, JXL, HEIC and more – built for smooth browsing across Windows, macOS, and Linux.项目地址https://gitcode.com/gh_mirrors/im/ImageGlass点击查看免费下载相关推荐超详细LocalSend Flatpak打包指南从构建到Flathub发布超详细LocalSend Flatpak打包指南从构建到Flathub发布 你还在为跨平台应用打包烦恼吗本文将以LocalSend项目为例带你从零开始掌握即时通讯网络/通信Komi Store Flatpak 打包指南离线依赖、沙箱限制与 Flathub 发布全流程Komi Store Flatpak 打包指南离线依赖、沙箱限制与 Flathub 发布全流程 Komi Store 是一个浏览、发现并一键安装 GitHub移动开发桌面应用CodeBurn Desktop 的 Flathub 发布指南deb 重打包、Flatpak 清单与维护流程CodeBurn Desktop 的 Flathub 发布指南deb 重打包、Flatpak 清单与维护流程 CodeBurn 是一个免费、本地的 AI 编码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考