实现前端直接展示后端传送的二进制图片数据(附代码)

 vue中的代码,需要axios和element-plus

<template>
  <el-carousel :interval="4000" type="card" height="300px">
    <el-carousel-item v-for="item in images" :key="item">
      <img :src="item.url" alt="Image" class="carousel-image" />
    </el-carousel-item>
  </el-carousel>
  <!-- <img :src="aaa" class="responsive-img" /> -->
  <el-button type="primary" @click="handleClick">Primary</el-button>
</template>

<script>
import { saveAs } from "file-saver";
// import img1 from "@/assets/images/12.jpg";
// import img2 from "@/assets/images/17.jpg";
import axios from "axios";
const blobUrls = [];
var imageNames = [];
export default {
  data() {
    return {
      images: [],
      aaa: "",
    };
  },
  created() {
    this.initialize().then(() => {
      const interval = setInterval(() => {
        if (this.imagesName !== null) {
          this.getFileBlobByName();
          clearInterval(interval);
        }
      }, 100); // Interval of 0.1 seconds (100 milliseconds)
    });
  },
  methods: {
    async initialize() {
      await this.getFileName();
    },
    handleClick() {
      // Your function logic here
      console.log("Button clicked!");
      console.log(imageNames);
    },
    // base64ToBlob(base64Data, contentType) {
    //   contentType = contentType || "";
    //   var sliceSize = 1024;
    //   var byteCharacters = atob(base64Data);
    //   var bytesLength = byteCharacters.length;
    //   var slicesCount = Math.ceil(bytesLength / sliceSize);
    //   var byteArrays = new Array(slicesCount);

    //   for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
    //     var begin = sliceIndex * sliceSize;
    //     var end = Math.min(begin + sliceSize, bytesLength);

    //     var bytes = new Array(end - begin);
    //     for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
    //       bytes[i] = byteCharacters[offset].charCodeAt(0);
    //     }
    //     byteArrays[sliceIndex] = new Uint8Array(bytes);
    //   }
    //   return new Blob(byteArrays, { type: contentType });
    // },
    // blobToFile(blob) {
    //   return new File([blob], "screenshot.png", { type: "image/jpeg" });
    // },
    // get64Data() {
    //   axios
    //     .get("/api/get_image_data")
    //     .then((response) => {
    //       // Handle the response data
    //       console.log(response.data.image_data);
    //       this.images = [
    //         { url: img1 },
    //         { url: img2 },
    //         { url: img1 },
    //         // Add more images if needed
    //       ];
    //       var base64Img = response.data.image_data;
    //       var contentType = "image/png";
    //       var fileImg = this.base64ToBlob(base64Img, contentType);
    //       // console.log("fileDetail:" + fileImg.size + fileImg.type + fileImg.arrayBuffer);

    //       // saveAs(fileImg, "test.png");
    //     })
    //     .catch((error) => {
    //       // Handle the error
    //       console.error(error);
    //     });
    // },
    // base64ImgtoFile(dataurl, filename = "file") {
    //   let arr = dataurl.split(",");
    //   let mime = arr[0].match(/:(.*?);/)[1];
    //   let suffix = mime.split("/")[1];
    //   let bstr = atob(arr[1]);
    //   let n = bstr.length;
    //   let u8arr = new Uint8Array(n);
    //   while (n--) {
    //     u8arr[n] = bstr.charCodeAt(n);
    //   }
    //   return new File([u8arr], `${filename}.${suffix}`, {
    //     type: mime,
    //   });
    // },
    getFileName() {
      axios
        .get("/api/get_file_list")
        .then((response) => {
          // Handle the response data
          imageNames = response.data;
          console.log(imageNames);
        })
        .catch((error) => {
          // Handle the error
          console.error(error);
        });
    },
    getFileBlob() {
      axios
        .get("/api/get_blob", { responseType: "blob" })
        .then((response) => {
          this.getFileName();
          // Handle the response data
          const blob = new Blob([response.data], { type: "image/png" });
          // saveAs(blob, "test.png");
          const blobUrl = URL.createObjectURL(blob);
          console.log(response);
          blobUrls.push(URL.createObjectURL(blob));
          console.log(blobUrls[0]);
          for (var i = 0; i < 4; i++) {
            this.images.push({ url: blobUrl });
          }
        })
        .catch((error) => {
          // Handle any errors
          console.error("Error:", error);
        });
    },
    getFileBlobByName() {
      for (var i = 0; i < imageNames.length; i++) {
        axios
          .get(`/api/get_blob_byName/${imageNames[i]}`, { responseType: "blob" })
          .then((response) => {
            console.log(response.data);
            const blob = new Blob([response.data], { type: "image/png" });
            const blobUrl = URL.createObjectURL(blob);
            this.images.push({ url: blobUrl });
          })
          .catch((error) => {
            // Handle any errors
            console.error("Error:", error);
          });
      }
    },
  },
};
</script>

<style scoped>
.carousel-image {
  width: 100%;
  height: auto;
  object-fit: contain;
}
.responsive-img {
  display: block;
  max-width: 100%;
  height: auto;
  margin: 0 auto;
}
</style>
后端使用 flask框架

@app.route("/get_file_list", methods=['GET'])
def get_file_list():
    image_dir = "./images/"
    images = []
    res = []
    for filename in os.listdir(image_dir):
        if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png"):
            # Create the full path to the image
            image_path = os.path.join(image_dir, filename)
            # Add the image path to the list
            images.append(image_path)

    for img in images:
        print(img)
        res.append(str(img))
    return jsonify(res)  # Return res list as JSON to the frontend


@app.route("/get_blob_byName/<path:param>", methods=['GET'])
def get_blob_by_name(param):
    if param:
        print(param)
        image = Image.open("./" + param)
        print(image)
        # Create a binary stream
        stream = BytesIO()
        file_extension = os.path.splitext(param)[1].lower()
        if file_extension == '.jpg' or file_extension == '.jpeg':
            image.save(stream, format='JPEG')
            stream.seek(0)  # Reset the stream position
            # Return the image file as a response
            a = send_file(stream, mimetype='image/jpeg')
            return a
        elif file_extension == '.png':
            image.save(stream, format='PNG')
            stream.seek(0)  # Reset the stream position
            # Return the image file as a response
            a = send_file(stream, mimetype='image/png')
            return a
        else:
            # Handle unsupported file formats or other conditions
            pass
        stream.close()
    else:
        return "No image path provided."

原理就是先获取图片所在的目录,返回目录下的所有图片的路径,在经过一个遍历拿到的所有图片路径,依次发送请求获取到其对应的blob格式数据,并且添加到src下即可实现图片的展示!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值