0


前端展示tif格式文件(缩略图展示)

背景

由于我司多半项目是Gis遥感类的项目,难免要和.tif/.tiff文件打交道,有些业务场景就需要对它们做展示或预览。


相关概念

什么是tif文件?

.tif文件是一种高质量的、无损压缩的位图图像格式,适用于需要高精度图像处理的场景,如出版印刷、摄影测量与遥感等。


所需依赖

  • tiff.js (npm i tiff.js)

demo效果


代码展示

template

用到了element-plus(^2.8.2)组件库
名称描述类型默认值on-change文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用Function-

  1. <!-- template 部分 -->
  2. <!-- 文件上传 部分 -->
  3. <el-upload
  4. ref="uploadRef"
  5. class="UploadDemo"
  6. :auto-upload="false"
  7. :multiple="true"
  8. :show-file-list="true"
  9. :drag="true"
  10. accept=".zip,"
  11. v-model:file-list="uploadFileList"
  12. :limit="2"
  13. :on-remove="handleRemove"
  14. :on-change="handleChange"
  15. :on-exceed="handleExceed"
  16. >
  17. <template #trigger>
  18. <el-icon size="30px"><upload-filled /></el-icon>
  19. <div class="el-upload__text">拖拽文件或 <em>点击选择</em></div>
  20. </template>
  21. <el-button
  22. style="margin-top: 10px"
  23. type="success"
  24. @click="submitUpload"
  25. >
  26. 上传
  27. </el-button>
  28. <!-- v-loading.fullscreen.lock="fullscreenLoading" -->
  29. <!-- <template #tip>
  30. <div class="el-upload__tip">
  31. 大小小于等于500MB 的 tif/tiff 文件
  32. </div>
  33. </template> -->
  34. </el-upload>
  35. <!-- 图片展示 部分 -->
  36. <el-image :src="src1" fit="cover">
  37. <template #error>
  38. <div class="image-slot">
  39. <el-icon color="#ccc"><icon-picture /></el-icon>
  40. </div>
  41. </template>
  42. </el-image>

script

Vue3 setup语法糖

注意点:必须要引入“Tiff”,并且在使用时要在“Tiff”的前面加上“window.”(window对象是bom的核心),否则也许会报“Tiff is not a constructor”的错误,如下面代码所示:

  1. import Tiff from "tiff.js";
  2. //缩略图url
  3. let src1 = ref("");
  4. // 上传文件
  5. // 文件上传列表
  6. let uploadFileList = ref([]);
  7. // 文件改变事件
  8. function handleChange(uploadFile, uploadFiles) {
  9. console.log(uploadFile.raw, "改变");
  10. uploadFileList.value.push(uploadFile.raw);
  11. console.log(uploadFileList.value);
  12. let fr = new FileReader();
  13. fr.readAsArrayBuffer(uploadFile.raw); //要取文件的raw属性
  14. fr.onload = function (e) {
  15. window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024 });
  16. let tiff = new window.Tiff({ buffer: e.target.result });
  17. //
  18. // 创建一个新的 Canvas 元素用于生成缩略图
  19. let canvas = document.createElement("canvas");
  20. let ctx = canvas.getContext("2d");
  21. // 获取 TIFF 图像的宽度和高度
  22. let width = tiff.width();
  23. let height = tiff.height();
  24. // 设定缩略图的尺寸,比如设置为原图的 1/20 大小
  25. let thumbnailWidth = width / 20;
  26. let thumbnailHeight = height / 20;
  27. // 调整 Canvas 的大小为缩略图大小
  28. canvas.width = thumbnailWidth;
  29. canvas.height = thumbnailHeight;
  30. // 绘制缩小后的图像到 Canvas 中
  31. ctx.drawImage(tiff.toCanvas(), 0, 0, thumbnailWidth, thumbnailHeight);
  32. // 将缩小后的图像转换为 Base64 URL
  33. src1.value = canvas.toDataURL(); // 转换为 Base64 的缩略图
  34. };
  35. }

展示请求资源

上文中展示的代码是,在上传tif文件的时候,展示选择的本地tif图像,如果是展示请求的网络资源,可以参考下面这段代码:

template

  1. <!-- 图片展示 部分 -->
  2. <el-image :src="src2" fit="cover">
  3. <template #error>
  4. <div class="image-slot">
  5. <el-icon color="#ccc"><icon-picture /></el-icon>
  6. </div>
  7. </template>
  8. </el-image>

script

如果访问的网络地址被同源策略禁止的话,你可能需要使用代理来处理跨域问题

  1. //script setup
  2. import Tiff from "tiff.js";
  3. let src2 = ref();
  4. var xhr = new XMLHttpRequest();
  5. xhr.responseType = "arraybuffer";
  6. //"tifurl → 后端返回的tif文件http地址 例如:http://192.168.8.126:80/img/cs.tif"
  7. xhr.open("GET", tifurl);
  8. xhr.onload = function (e) {
  9. window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024})
  10. var tiff = new window.Tiff({ buffer: xhr.response });
  11. // 创建一个新的 Canvas 元素用于生成缩略图
  12. let canvas = document.createElement("canvas");
  13. let ctx = canvas.getContext("2d");
  14. // 获取 TIFF 图像的宽度和高度
  15. let width = tiff.width();
  16. let height = tiff.height();
  17. // 设定缩略图的尺寸,比如设置为原图的 1/2 大小
  18. let thumbnailWidth = width / 2;
  19. let thumbnailHeight = height / 2;
  20. // 调整 Canvas 的大小为缩略图大小
  21. canvas.width = thumbnailWidth;
  22. canvas.height = thumbnailHeight;
  23. // 绘制缩小后的图像到 Canvas 中
  24. ctx.drawImage(tiff.toCanvas(), 0, 0, thumbnailWidth, thumbnailHeight);
  25. // 将缩小后的图像转换为 Base64 URL
  26. src2.value = canvas.toDataURL(); // 转换为 Base64 的缩略图
  27. // console.log("toDataURL:" + src2.value);
  28. };
  29. xhr.onerror = function (e) {
  30. console.log("xhr onerror: ↓");
  31. console.log(e);
  32. };
  33. xhr.send();

其他

处理超大文件的问题:

我在测试的时候,tif文件的大小在250MB左右,运行是没有问题的,如果不进行缩略图处理的话,页面会有明显卡顿。

也有尝试处理3GB左右的tiff文件,比如将“window.Tiff.initialize({ TOTAL_MEMORY: 1024 * 1024 * 1024 });”的值加大,或者在“fr.readAsArrayBuffer(uploadFile.raw);”这一步做截取,结果都失败了,如果大家有好的处理方法的话欢迎评论告诉我,不胜感激。

处理32-bit的tif文件问题:

tiff.js无法处理32位样本的图像,如下图所示:(24位测试是可以的)


本文转载自: https://blog.csdn.net/weixin_59259086/article/details/142344800
版权归原作者 博客风气调查员 所有, 如有侵权,请联系我们删除。

“前端展示tif格式文件(缩略图展示)”的评论:

还没有评论