基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

news2024/10/7 14:24:47

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

高分辨率大图像在 Web 中查看可以使用 Deep Zoom 技术,这是一种用于查看和浏览大型高分辨率图像的技术,它可以让用户以交互方式浏览高分辨率大图像,并且能够在不影响图像质量的情况下进行缩放和平移操作。

技术点

1、Deep Zoom 技术

以下是一些关于 Deep Zoom 交互方式查看高分辨率图像技术的知识点:

  1. Deep Zoom 技术基于“金字塔式”(pyramidal)图像结构,它将原始高分辨率图像分成多个分辨率级别,每个级别都是原始图像的缩小版本。这种结构允许 Deep Zoom 在不失真地缩放大图像时,只加载所需的图像分块。

  2. Deep Zoom 技术基于 Deep Zoom Composer 和 Microsoft Silverlight 软件,用于创造和浏览基于图像的收藏品,例如地图、照片和艺术品等。

  3. Deep Zoom 技术允许用户通过鼠标或手势进行缩放和平移操作,以便在大图像中查看细节。它还可以与其他交互和导航功能结合使用,例如缩略图、搜索和标记等。

  4. Deep Zoom 技术支持多种图像格式,包括 JPEG、PNG 和 TIFF 等。它还可以与其他技术和平台结合使用,例如地图服务和 GIS 应用程序等。

2、DZI 格式

DZI 格式是 Deep Zoom Image 格式的缩写,是一种用于存储和展示高分辨率图像的格式。DZI 格式是基于“金字塔式”(pyramidal)图像结构的,它将原始高分辨率图像分成多个分辨率级别,每个级别都是原始图像的缩小版本。这种结构允许 Deep Zoom 在不失真地缩放大图像时,只加载所需的图像分块。

DZI 格式通常由 Deep Zoom Composer 软件生成,该软件可以将任何大型图像转换为 DZI 格式,并生成所需的图像分块。这些图像分块以及其他相关的元数据信息被打包成一个或多个.DZI 文件,然后可以通过网络传输到客户端,供使用 Deep Zoom 技术的应用程序使用。

DZI 格式除了可以在 Deep Zoom Composer 中使用外,还可以在其他 Deep Zoom 应用程序中使用,例如在基于 Silverlight 或 JavaScript 的 Deep Zoom 浏览器应用程序中。此外,DZI 格式还支持多种图像格式,包括 JPEG、PNG 和 TIFF 等,并且可以与其他技术和平台结合使用,例如地图服务和 GIS 应用程序等。

DZI 格式是一种灵活、高效的图像格式,可用于存储和展示高分辨率图像,并且在 Deep Zoom 技术中发挥着重要的作用。

一、使用 VIPS 将高分辨率大图像转换为 DZI 文件

以下是几种可以生成 DZI 文件的工具:

  • Deep Zoom Composer:这是一款免费的 Windows 应用程序,可以将高分辨率图像转换为 DZI 格式,并生成所需的图像分块和元数据信息。Deep Zoom Composer 提供了用户友好的图形界面,可以轻松地对图像进行拖放、缩放和裁剪等操作,并支持多种输出选项和参数设置。

  • Imagemagick:这是一个开源的图像处理工具集,可以将原始图像转换为 DZI 格式并生成所需的图像分块和元数据。Imagemagick 支持多种图像格式,包括 JPEG、PNG 和 TIFF 等,但是它没有专门的 Deep Zoom 功能或 API。

  • VIPS:这是一个基于开源技术的图像处理库,可以将原始图像转换为 DZI 格式并生成所需的图像分块和元数据。VIPS 支持多种图像格式,包括 JPEG、PNG 和 TIFF 等,并且具有高度定制化的功能和 API。

以下以 VIPS 作为生成 DZI 文件的工具进行实践:

  1. 安装 VIPS

    具体安装步骤请参考libvips Install。

    注意,在 windows 11 中安装 v8.14.2 版本后,在运行vips dzsave **.jpg mydz命令时,出现 vips: unknown action "dzsave" 报错,解决办法是重装低版本 v8.14.1,因为在 v8.14.2 中 dzsave 功能被移除了,但有可能在后续版本中会添加回来。

  2. 安装 pyvips

    pip install pyvips
    

    pyvips API 参考文档:pyvips

  3. 生成 DZI

    import os
    import pyvips
    
    vipsbin = r'F:\vips-dev-8.14\bin'
    add_dll_dir = getattr(os, 'add_dll_directory', None)
    if callable(add_dll_dir):
        add_dll_dir(vipsbin)
    else:
        os.environ['PATH'] = os.pathsep.join((vipsbin, os.environ['PATH']))
    
    current_abspath = os.path.dirname(os.path.abspath(__file__))
    
    # 打开图像
    image = pyvips.Image.new_from_file(os.path.join(current_abspath, 'bigimage.png'))
    
    # 生成 DZI
    image.dzsave(os.path.join(current_abspath, 'mydz'),
                suffix='.jpg', tile_size=512, overlap=1)
    

    dzsave 参数说明:

    • 第一个参数为 DZI 文件夹的路径,将在此处生成 DZI 文件。
    • suffix:生成的 DZI 图像文件的后缀名。
    • tile_size:DZI 图像的瓷砖大小。
    • overlap:DZI 图像的瓷砖之间的重叠区域大小。

    上述代码运行后,将在代码文件目录下生成 mydz.dzi 文件和 mydz_fils 文件夹。其中,dzsave 方法的使用请参考官方文档:pyvips.Image.dzsave。

二、使用 flask 为 DZI 提供 HTTP 服务

from flask import Flask, send_from_directory

app = Flask(__name__)

@app.route('/<path:path>')
def static_file(path):
    return send_from_directory('.', path)

if __name__ == '__main__':
    app.run(port=8008)

三、使用 OpenSeadragon 实现 Web 访问

关于 OpenSeadragon 的使用请参考官方文档 OpenSeadragon。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Big Image Viewer</title>
    <script src="./openseadragon/openseadragon.min.js"></script>
    <style type="text/css">
      html,
      body,
      .openseadragon-ctr {
        width: 100%;
        height: 100%;
        margin: 0;
        background-color: #111;
      }
    </style>
  </head>

  <body>
    <div id="contentDiv" class="openseadragon-ctr"></div>

    <script type="text/javascript">
      OpenSeadragon({
        id: "contentDiv",
        prefixUrl: "openseadragon/images/",
        showNavigator: false,
        navigatorPosition: "BOTTOM_LEFT",
        tileSources: {
          Image: {
            xmlns: "http://schemas.microsoft.com/deepzoom/2008",
            // 生成的 DZI 文件 HTTP 访问路径
            Url: "../mydz_files/",
            Format: "jpg",
            Overlap: "1",
            TileSize: "512",
            Size: {
              Height: "3971",
              Width: "73364",
            },
          },
        },
      });
    </script>
  </body>
</html>

查看效果:

  1. 初始状态

    img

  2. 放大状态

    img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建个人网站 保姆级教程(四)Navicat链接mySql 失败

长时间没有折腾云服务器上的mysql了&#xff0c;今天再次使用Navicat连接云服务器上的mysql时&#xff0c;输入密码报错&#xff01; 1130 - Host ‘119.130.212.168’ is not allowed to connect to this MySQL server 1.于是Royal TSX 远程服务器查看mysql的状态 systemctl …

通达信标记文字中可能用到的特殊符号大全

特殊符号是难以直接输入的符号&#xff0c;特殊符号是符号的一种&#xff0c;比如说圆圈&#xff08;〇&#xff09;、叉号&#xff08;✕、✖、✘&#xff09;、五角星&#xff08;★、☆&#xff09;、勾号&#xff08;✓、✔&#xff09; 。 01.特殊符号简表 ♠♣♧♡♥❤…

chatgpt赋能python:Python强制取整:如何在Python中正确进行取整操作

Python强制取整&#xff1a;如何在Python中正确进行取整操作 Python是一种广泛使用的编程语言&#xff0c;有许多不同的用途&#xff0c;包括数据分析、web开发、机器学习、科学计算等等。Python语言非常容易学习和使用&#xff0c;但有时候它的行为可能会出人意料&#xff0c…

alpa概览

文章目录 背景alpa简介DeviceMesh跨 DeviceMeshes 的 GPU Buffer管理Ray CollectivePipeline parallelism runtime orchestration运行时 背景 LLM训练有3D并行的需求&#xff08;alpa将数据并行视为张量并行&#xff0c;即张量沿batch切分&#xff09; 算子间并行的通信成本小…

【Vue】父子组件传参 孙子调用爷爷的方法 provide inject

一. 父传子 父组件先在data中定义要传给子组件的属性名父组件在中引入子组件在components中注册使用步骤 3 中注册好的子组件在 3 中&#xff0c;父传子 &#xff08;1&#xff09;利用 : 将父组件的对象、数组、字符串等传给子组件&#xff0c;供子组件使用 &#xff08;2&am…

Rocky Linux9安装教程

序言 Centos废了&#xff0c;最近在考虑将服务器迁移至Rockylinux系统&#xff0c;在这里记录下安装过程 当前安装版本RockyLinux9.2&#xff08;minimal版本&#xff09;&#xff0c;VMware Fusion专业版13.0.2 创建虚拟机 第一步&#xff1a; 先下载好ISO文件&#xff0c…

python-高级特性

文章目录 1.生成式2.生成器3.闭包4.装饰器&#xff08;1&#xff09;万能装饰器的实现&#xff08;2&#xff09;含参数的装饰器&#xff08;3&#xff09;多装饰器 5.内置高阶函数 1.生成式 列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表…

2023.6.7小记——什么是FPGA?

最近打算开始继续做一些个人分享&#xff0c;已经太久时间没有写文章了&#xff0c;感觉这样下去肯定不是个好事&#xff0c;当程序员当然是要保持分享~ 标题就暂时先以每天我认为最重要的一点来取&#xff0c;内容不仅限于此。 1. 什么是FPGA&#xff1f; 全称是Field-Progra…

PCL 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

Linux操作系统——第二章 进程控制

目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 进程常见退出方法 _exit函数 exit函数 return退出 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 进程程序…

接口测试框架实战 | 通用 API 封装实战

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

火龙果MM32F3273G8P开发板MindSDK开发教程3 - Sysclk的配置

Sysclk的配置 1、时钟初始化流程 一般流程为startup_mm32f3273g.s中调用system_mm32f3273g.c中的SystemInit函数完成系统时钟的初始&#xff0c;而system_mm32f3273g.c中函数是空的。 原来MindSdk时钟初始化的流程放到了clock_init.c中。 2、采用外部高速时钟源 先弄清几个…

Effective第三版 中英 | 第二章 创建和销毁对象 | 通过私有构造器强化不可实例化的能力

文章目录 Effective第三版前言第二章 创建和销毁对象通过私有构造器强化不可实例化的能力 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记…

文本三剑客 之 grep

目录 一.grep 1.grep常用选项命令选项 2.grep 命令选项 3.简单的正则表达式 二.sort 命令 三.uniq 去重 四 .语法格式&#xff1a; tr 选项 参数 五.快速裁剪命令——cut: 六.split 文件拆分 七.文件合并——paste 一.grep 文本三剑客了之一&#xff0c;对文本内容进行…

网络通信 --- HTTP 协议初识

目录 &#x1f332;一、HTTP 协议是什么 &#x1f333;二、HTTP协议格式 &#x1f9aa;1.抓包工具的使用(以 Fiddler 为例) &#x1f363;2. 抓包工具的原理 (以 Fiddler 为例) &#x1f364;3. 抓包结果 &#x1f365;① HTTP 请求(request) &#x1f96e;②HTTP响应(re…

chatgpt赋能python:Python中的平均值如何计算?

Python中的平均值如何计算&#xff1f; 在Python编程中&#xff0c;求取列表、元组或数据集合的平均值是一个相当常见的操作。幸运的是&#xff0c;Python内置的统计模块提供了方便的方法去实现这个操作。在这篇文章里&#xff0c;我们将探讨计算平均值的方法&#xff0c;帮助…

Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续讲二次元角色材质的制作。这次是讲头部的做法。 1、脸部 之前在分析资源的时候&#xff0c;其实已经发现了这个模型的脸部法线有问题&#xff0c;导致在做光照模型的时候&#xff0c;脸部很奇怪。 把f…

阅读ConcurrentHashMap源码,我学到了什么?

文章目录 ConcurrentHashMap怎样保证线程安全的put元素的流程具体对于红黑树是怎样保证线程安全的如何并发安全的初始化一个数组如何统计存储元素个数的怎样进行多线程扩容的 首先说明, 本篇分析基于jdk1.8. ConcurrentHashMap怎样保证线程安全的 ConcurrentHashMap主要是通过…

Java:字符流

字符流的底层其实就是字节流。 字符流字节流字符集 结构体系&#xff1a; 1.特点 输入流:一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节。 输出流:底层会把数据按照指定的编码方式进行编码&#xff0c;变成字节再写到文件中。 2.使用场景 对于纯文本…

AI实战营第二期 笔记5——MMPretrain代码课

文章目录 摘要MMPreTrain实战安装推理 OR 使用API数据集训练与测试微调 摘要 MMPretrain 是一个全新升级的预训练开源算法框架&#xff0c;旨在提供各种强大的预训练主干网络&#xff0c; 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSel…