首页 > 其他分享 >接口实现任意格式图像的传参接收

接口实现任意格式图像的传参接收

时间:2024-11-25 14:59:20浏览次数:11  
标签:传参 pil import image 接口 io 图像 格式 Image

基于FastAPI的图像接收接口设计与实现

概述

在现代Web应用中,图像处理是一个常见的需求。无论是图像识别、图像分类还是图像编辑,都需要一个高效且灵活的接口来处理不同来源的图像数据。本文将详细介绍如何设计一个基于FastAPI的接口,使其能够接受任意类型的图像对象,并进行相应的处理。

  • 支持多种图像来源:接口应能够处理本地文件、HTTP/HTTPS地址、Base64编码的图像以及文件流数据。

目录

  1. FastAPI简介
    • 1.1 FastAPI的特点
    • 1.2 FastAPI与Flask、Django的比较
  2. 图像处理基础
    • 2.1 图像格式与编码
    • 2.2 PIL库简介
    • 2.3 图像的常见操作
  3. 接口设计
    • 3.1 接口需求分析
    • 3.2 接口参数设计
    • 3.3 接口返回值设计
  4. 图像数据处理
    • 4.1 本地文件处理
    • 4.2 HTTP/HTTPS图像处理
    • 4.3 Base64编码图像处理
    • 4.4 文件流处理
  5. 代码实现
    • 5.1 核心函数实现
    • 5.2 接口路由实现
    • 5.3 错误处理与日志记录

1. FastAPI的特点

FastAPI是一个现代、快速(高性能)的Web框架,用于构建API。它基于Python 3.7+的类型提示,利用了Python的类型系统来提供自动化的数据验证、序列化和文档生成。FastAPI的主要特点包括:

  • 高性能:基于Starlette和Pydantic,FastAPI在性能上接近Node.js和Go。
  • 自动文档生成:支持Swagger UI和ReDoc,自动生成API文档。
  • 类型安全:利用Python的类型提示,提供强大的数据验证和序列化功能。
  • 异步支持:完全支持异步编程,适合处理高并发的场景。

2. 图像处理基础

2.1 图像格式与编码

图像格式是指图像数据的存储方式,常见的图像格式包括JPEG、PNG、GIF、BMP等。每种格式都有其特定的编码方式,决定了图像的质量、压缩比和文件大小。

  • JPEG:有损压缩格式,适合存储照片。
  • PNG:无损压缩格式,适合存储图标、图形等。
  • GIF:支持动画,适合存储简单的动画图像。
  • BMP:无压缩格式,适合存储高质量的图像。

2.2 PIL库简介

PIL(Python Imaging Library)是Python中用于图像处理的强大库。它提供了丰富的图像处理功能,包括图像的打开、保存、裁剪、旋转、缩放等。PIL的继承者Pillow库在Python 3中得到了广泛应用。

2.3 图像的常见操作

在图像处理中,常见的操作包括:

  • 打开图像:使用Image.open()方法打开图像文件。
  • 保存图像:使用Image.save()方法保存图像到文件。
  • 裁剪图像:使用Image.crop()方法裁剪图像。
  • 旋转图像:使用Image.rotate()方法旋转图像。
  • 缩放图像:使用Image.resize()方法缩放图像。

3. 接口设计

3.1 接口需求分析

在设计图像处理接口时,我们需要考虑以下需求:

  • 支持多种图像来源:接口应能够处理本地文件、HTTP/HTTPS地址、Base64编码的图像以及文件流。
  • 灵活的参数设置:用户应能够自定义一些参数,如置信度阈值。
  • 高效的图像处理:接口应能够快速处理图像,并返回处理结果。

3.2 接口参数设计

接口的参数设计应尽可能灵活,以满足不同用户的需求。常见的参数包括:

  • 图像数据:支持多种图像来源,如本地文件、HTTP/HTTPS地址、Base64编码的图像、文件流。
  • 置信度阈值:用于控制识别结果的置信度,默认值为0.6。

3.3 接口返回值设计

接口的返回值应包含处理后的图像数据以及相关的元数据。常见的返回值包括:

  • 图像数据:处理后的图像数据,可以以Base64编码或其他格式返回。
  • 元数据:包括图像的尺寸、格式、处理时间等信息。

4. 图像数据处理

4.1 本地文件处理

处理本地文件时,可以直接使用Image.open()方法打开图像文件。代码示例如下:

from PIL import Image

def process_local_image(image_path: str) -> Image.Image:
    pil_image = Image.open(image_path).convert("RGB")
    return pil_image

4.2 HTTP/HTTPS图像处理

处理HTTP/HTTPS地址的图像时,可以使用requests库下载图像,并使用Image.open()方法打开图像。代码示例如下:

import requests
from PIL import Image
import io

def process_http_image(image_url: str) -> Image.Image:
    response = requests.get(image_url, stream=True)
    response.raise_for_status()
    pil_image = Image.open(io.BytesIO(response.content)).convert("RGB")
    return pil_image

4.3 Base64编码图像处理

处理Base64编码的图像时,需要先解码Base64数据,然后使用Image.open()方法打开图像。代码示例如下:

import base64
from PIL import Image
import io

def process_base64_image(image_base64: str) -> Image.Image:
    if ";base64," in image_base64:
        image_data = image_base64.split(";base64,")[1]
    else:
        image_data = image_base64
    image_content = base64.b64decode(image_data)
    image_io = io.BytesIO(image_content)
    pil_image = Image.open(image_io).convert("RGB")
    return pil_image

4.4 文件流处理

处理文件流时,可以直接读取文件流的内容,并使用Image.open()方法打开图像。代码示例如下:

from PIL import Image
import io

def process_file_stream(file_stream) -> Image.Image:
    image_content = file_stream.read()
    image_io = io.BytesIO(image_content)
    pil_image = Image.open(image_io).convert("RGB")
    return pil_image

5. 代码实现

5.1 核心函数实现

核心函数get_pil_images_in_anyway负责处理不同来源的图像数据,并返回PIL图像对象。代码如下:

from PIL import Image
import requests
import io
import base64
from fastapi import UploadFile

def get_pil_images_in_anyway(image: str or UploadFile) -> Image.Image:
    """
    获取图片信息,包括来源为本地地址、http地址、文件流等。
    """
    pil = None
    if isinstance(image, str):
        if image.startswith("http://") or image.startswith("https://"):
            response = requests.get(image, stream=True)
            response.raise_for_status()  # 检查请求是否成功
            pil = Image.open(io.BytesIO(response.content)).convert("RGB")
        elif is_base64_image(image):
            # 提取 Base64 数据部分
            if ";base64," in image:
                image_data = image.split(";base64,")[1]
            else:
                image_data = image
            # 处理 Base64 编码的图像
            image_content = base64.b64decode(image_data)
            image_io = io.BytesIO(image_content)
            pil = Image.open(image_io).convert("RGB")
        else:
            pil = Image.open(image).convert("RGB")
    elif isinstance(image, UploadFile):
        image_content = image.file.read()
        image_io = io.BytesIO(image_content)
        pil = Image.open(image_io).convert("RGB")
    else:
        print('get_pil_images_in_anyway的输入image数据不合法。')

    return pil

5.2 接口路由实现

接口路由/img/rec负责接收图像数据,并调用核心函数进行处理。代码如下:

from fastapi import FastAPI, File, UploadFile, Form
from typing import Union

app = FastAPI()

@app.post('/img/rec')
async def img_rec(
        threshold: float = Form(default=0.6, description='可选参。识别返回的置信度阈值,默认0.6'),
        image: Union[str, UploadFile] = File(..., description='必要参。待识别的图片,支持二进制格式、base64位图片字符串、http图片地址、服务器资源地址')
        ):
    pil_image = get_pil_images_in_anyway(image)
    # 进行图像识别或其他处理
    # ...
    return {"image_data": "processed_image_data", "metadata": "metadata"}

5.3 错误处理与日志记录

在实际应用中,错误处理和日志记录是非常重要的。我们可以使用Python的logging模块来记录日志,并使用try-except块来捕获和处理异常。代码示例如下:

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.post('/img/rec')
async def img_rec(
        threshold: float = Form(default=0.6, description='可选参。识别返回的置信度阈值,默认0.6'),
        image: Union[str, UploadFile] = File(..., description='必要参。待识别的图片,支持二进制格式、base64位图片字符串、http图片地址、服务器资源地址')
        ):
    try:
        pil_image = get_pil_images_in_anyway(image)
        # 进行图像识别或其他处理
        # ...
        return {"image_data": "processed_image_data", "metadata": "metadata"}
    except Exception as e:
        logger.error(f"Error processing image: {e}")
        return {"error": str(e)}

标签:传参,pil,import,image,接口,io,图像,格式,Image
From: https://blog.csdn.net/A15216110998/article/details/144022993

相关文章

  • 前端修改代理、通过node mock后端接口
    在前端开发中,有时候会需要mock接口,虽然有的工具提供了云端mock的功能,但是定制化比较低,所以我用node写了一个mock小工具,主要使用了express、mockjs、cors,"cors":"^2.8.5","express":"^4.19.2","mockjs":"^1.1.0"使用两个文件即可完成这个小功能首先搭建一个简单的......
  • 记录一个Linux代码移植到Windows平台下的Visual Studio 2022的代码编码格式的问题
    一、前言工作上与公司的前辈对接,他给了我一份在linux下面编写的代码压缩包,按照道理来说使用条件宏编译不同的windows和linux的API即可实现代码的通用。但是我在VisualStudio2022下面编译的时候缺发生了非常奇怪的事情。随便编译就出现很多报错,但实际上这些报错并不是真正的报错......
  • 【面向对象的程序设计——接口与多态】类型转换,方法的查找,多态(一)
    文章目录类型转换类型转换的规则转型或向上转型隐式转换显示类型转换方法的查找实例方法的查找类方法查找多态(一)多态的概念多态的作用/目的绑定绑定的概念绑定的分类静态绑定动态绑定类型转换类型转换的规则基本类型之间的转换:就是将值从一种类型转变为另一种......
  • 第55篇 如何保证接口的幂等性问题
    1.接口幂等性定义接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。具体到HTTP接口或者服务间的API调用,接口幂......
  • 用哪种格式可以存储包含Alpha通道的图像?Alpha通道是指什么?
    几种图像格式可以存储包含Alpha通道的图像,Alpha通道表示图像中每个像素的透明度或不透明度。以下是一些常用的格式:PNG(PortableNetworkGraphics):PNG是web上最常用的支持Alpha通道的格式。它支持无损压缩,这意味着图像质量在压缩过程中不会损失。PNG尤其适合具有......
  • 【web】Gin+Go-Micro +Vue+Nodejs+jQuery+ElmentUI 用户模块之vue登录开发以及接口联
    在现代Web应用中,实现用户登录模块是一个关键功能。本文将分为初级、中级、高级阶段,详细说明如何使用Vue、ElementUI进行登录开发,并与Gin、Go-Micro、Node.js进行接口联调。初级用法介绍在初级阶段,主要关注于使用Vue和ElementUI创建一个简单的登录界面,并通过Node.js后端进......
  • vscode如何更改文件语言模式为json格式
    前言大家好,我是小徐啊。vscode是一款常用的开发工具,非常适合前端开发,但同时,它也适合后端开发。比如Java,可以通过安装一些插件的方法,来支持开发Java。而且,它还能帮助我们快速处理一些文本,比如将json形式的文本,格式化,方便查看等。今天,小徐就来介绍下如何用vscode更改文件语言模式为......
  • D78【 python 接口自动化学习】- python基础之HTTP
    day78pycharm创建项目并进行接口请求学习日期:20241124学习目标:http定义及实战--pycharm创建项目并进行接口请求学习笔记:安装requests安装方式:pip/pip3installrequests官网教程:Requests:HTTPforHumans™—Requests2.32.3documentation安装方式方法一:终端安......
  • 【MySQL系列】使用正则表达式确保`card_secret`字段格式正确
    ......
  • 类和对象(继承、接口)
    类是一个抽象的概念,它定义了一组具有相同属性和行为的对象。类本身并不占用从内存空间,只有在创建对象才会实例化。对象是类的具体实例,是一个实实在在的东西。对象具有状态和行为。同过数据值描述转台,通过操作改变状态。面向对象的编程语言面向对象编程的四项基本原则是:1.抽......