当前位置: 首页 > news >正文

vue3页面显示tiff图片

浏览器网页一般不直接支持tiff图片的显示,需要用到tiff.js这个库,首先安装tiff.js,使用命令 npm install tiff.js安装。

首先,引入相关库

import axios from 'axios';
import { ref } from 'vue';
import {TIFF } from 'tiff.js'

在vue中定义能显示图片的容器,与Vue的imgDB变量绑定,如下代码:

<template>
    <img class="db1" :src="imgDB" alt="000" />
</template>

定义变量,其中变量imgDB与图片显示的<img>绑定一块,变量imgUrl存放了tif图片的访问地址。代码如下:

const imgDB= ref('');
const imgUrl='http://192.168.66.1/images/10.tif';

需要注意的是imgUrl是经过Ngnix代理后的地址,Vue请求Ngnix要面临一个跨域的问题,这就需要设置Ngnix的ngnix.conf配置文件,如下:

#图片代理路径
location /images/ {
    alias  C:/Users/wchw/Desktop/share/;
    autoindex on;
    # 添加 CORS 头
    add_header 'Access-Control-Allow-Origin' '*' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type' always;
    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
    # 处理 OPTIONS 请求
    #if ($request_method = OPTIONS) {
    #    add_header 'Access-Control-Allow-Origin' '*' always;
    #    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
    #    add_header 'Access-Control-Allow-Headers' 'DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type' always;
    #    return 204;
    #}
}

下面是转换tiff图片的函数,如下:

function setImg(imgUrl) {
    window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024 });
    axios.get(imgUrl, { responseType: 'blob' })
        .then(response => {
            response.data.arrayBuffer().then((arrayBuffer) => {
                const tiff = new window.Tiff({
                buffer: arrayBuffer,
            });
            imgDB.value = tiff.toDataURL()
        })
    })
    .catch(error => {
    console.error('Error fetching data:', error);
    });
}

如果图片过大,比如几百兆,现实就有困难,可以对图片进行一定的压缩,代码如下:

function setImg(imgUrl) {
    window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024 });
    axios.get(imgUrl, { responseType: 'blob' })
        .then(response => {
            response.data.arrayBuffer().then((arrayBuffer) => {
                const tiff = new window.Tiff({
                buffer: arrayBuffer,
            });
            // 创建一个新的 Canvas 元素用于生成缩略图
            let canvas = document.createElement("canvas");
            let ctx = canvas.getContext("2d");
            // 获取 TIFF 图像的宽度和高度
            let width = tiff.width();
            let height = tiff.height();
            // 设定缩略图的尺寸,比如设置为原图的 1/30 大小
            let thumbnailWidth = width / 30;
            let thumbnailHeight = height / 30;
            // 调整 Canvas 的大小为缩略图大小
            canvas.width = thumbnailWidth;
            canvas.height = thumbnailHeight;
            console.log("--------->width:"+width+", height:"+height);
            // 绘制缩小后的图像到 Canvas 中
            ctx.drawImage(tiff.toCanvas(), 0, 0, thumbnailWidth, thumbnailHeight);
            imgDB.value = canvas.toDataURL(); // 转换为 Base64 的缩略图
            // imgDB.value = tiff.toDataURL()
        })
    })
    .catch(error => {
    console.error('Error fetching data:', error);
    });
}

最后完整的代码如下:

<script setup>
    import axios from 'axios';
    import { ref } from 'vue';
    import {TIFF } from 'tiff.js'

    const imgDB= ref('');
    const imgUrl='http://192.168.66.1/images/10.tif';
    setImg(imgUrl);

    function setImg(imgUrl) {
        window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024 });
        axios.get(imgUrl, { responseType: 'blob' })
        .then(response => {
            response.data.arrayBuffer().then((arrayBuffer) => {
                const tiff = new window.Tiff({
                    buffer: arrayBuffer,
                });
                // 创建一个新的 Canvas 元素用于生成缩略图
                let canvas = document.createElement("canvas");
                let ctx = canvas.getContext("2d");
                // 获取 TIFF 图像的宽度和高度
                let width = tiff.width();
                let height = tiff.height();
                // 设定缩略图的尺寸,比如设置为原图的 1/30 大小
                let thumbnailWidth = width / 30;
                let thumbnailHeight = height / 30;
                // 调整 Canvas 的大小为缩略图大小
                canvas.width = thumbnailWidth;
                canvas.height = thumbnailHeight;
                console.log("--------->width:"+width+", height:"+height);
                // 绘制缩小后的图像到 Canvas 中
                ctx.drawImage(tiff.toCanvas(), 0, 0, thumbnailWidth, thumbnailHeight);
                imgDB.value = canvas.toDataURL(); // 转换为 Base64 的缩略图
                // imgDB.value = tiff.toDataURL()
            })
        })
        .catch(error => {
            console.error('Error fetching data:', error);
        });
    }
</script>


<template>
    <img class="db1" :src="imgDB" alt="000" />
</template>

相关文章:

  • 解析HTML时需要注意什么?
  • 微软发布Majorana 1芯片,开启量子计算新路径
  • 手动搭建Redis1主2从+ 3 Sentinel 高可用集群
  • 《DAMA 数据治理知识指南》第八章 数据集成和互操作读书笔记
  • 深度学习之图像分类(二)
  • DIP的实际举例
  • 一文讲解Redis中的集群数据分区相关问题
  • PiscTrace的开发者版
  • MySQL之表连接深度解析:原理、类型、算法与优化
  • [数据结构]双链表详解
  • 非容器化部署nginx
  • Kubernetes控制平面组件:APIServer 基于 Webhook Toeken令牌 的认证机制详解
  • Spring MVC 框架学习笔记:从入门到精通的实战指南
  • CAN 分析框架 CANToolz
  • ZLMediakit开源视频服务器——配置到本地服务器
  • Java IO 和 NIO 的基本概念和 API
  • 【Linux】UDP协议
  • 进程及相关概念
  • 【Linux网络编程】socket套接字的基础API接口
  • 《深度剖析:人工智能与元宇宙构建的底层技术框架》
  • 上海杨浦:优秀“博主”购房最高可获200万补贴
  • 2025柯桥时尚周启幕:国际纺都越来越时尚
  • 美乌基金协议:美国搞了一套可在资源富集地区复刻的商业模式
  • 复旦发文缅怀文科杰出教授裘锡圭:曾提出治学需具备三种精神
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元
  • 吴勇强、高颜已任南京市委常委