递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 881|回复: 6
打印 上一主题 下一主题

[其它] 吴总参考一下,彻底解决封库的问题

[复制链接]

49

主题

528

帖子

1923

积分

金牌会员

Rank: 6Rank: 6

积分
1923
QQ
跳转到指定楼层
楼主
发表于 前天 02:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过将 Python 实现的功能编译成 WebAssembly (Wasm),可以创建一个完全跨平台的、可被任何编程语言调用的库。

--------------------------------
具体步骤演示(以图像处理库为例)1. Python 功能实现 (image_processor.py)
---------------------------------
from PIL import Image
import numpy as np

def resize_image(image_data, width, height):
    """调整图像尺寸"""
    img = Image.frombytes('RGB', (width, height), image_data)
    img = img.resize((width // 2, height // 2))  # 缩小50%
    return img.tobytes()

def apply_filter(image_data, width, height, filter_name):
    """应用图像滤镜"""
    img = Image.frombytes('RGB', (width, height), image_data)

    if filter_name == "grayscale":
        img = img.convert("L")
    elif filter_name == "edge_detect":
        # 简单的边缘检测
        arr = np.array(img)
        gray = np.mean(arr, axis=2)
        edges = np.abs(np.gradient(gray)[0]) + np.abs(np.gradient(gray)[1])
        img = Image.fromarray(np.uint8(edges))

    return img.tobytes(), img.width, img.height
------------------------------
2. 定义 WIT 接口 (image.wit)-------------------------
package example:image

interface processor {
    /// 调整图像尺寸
    /// @param image-data: 原始图像二进制数据
    /// @param width: 原始宽度
    /// @param height: 原始高度
    /// @return: 调整后的图像数据
    resize: func(
        image-data: list<u8>,
        width: u32,
        height: u32
    ) -> list<u8>

    /// 应用图像滤镜
    /// @param filter-name: 滤镜名称 (grayscale/edge_detect)
    /// @return: tuple(处理后的图像数据, 新宽度, 新高度)
    apply-filter: func(
        image-data: list<u8>,
        width: u32,
        height: u32,
        filter-name: string
    ) -> tuple<list<u8>, u32, u32>
}

world image-processor {
    export processor
}

--------------------------
3. 编译为 Wasm 组件
-------------------------
# 安装编译工具
pip install pyodide-build wit-bindgen

# 创建虚拟环境(包含依赖)
python -m venv .env
source .env/bin/activate
pip install pillow numpy

# 编译为 Wasm
pyodide build --output image_processor.wasm image_processor.py

# 嵌入 WIT 接口
wasm-tools component embed image.wit image_processor.wasm -o image_processor_component.wasm

# 优化大小 (可选)
wasm-opt -O3 image_processor_component.wasm -o image_processor_optimized.wasm

--------------------------------
4. 其他语言调用示例
-------------------
#include <stdio.h>
#include <wasmtime.h>

void process_image() {
    // 初始化Wasm引擎
    wasm_engine_t *engine = wasm_engine_new();
    wasm_store_t *store = wasm_store_new(engine);

    // 加载Wasm组件
    wasm_module_t *module = wasm_module_from_file(store, "image_processor_optimized.wasm");
    wasm_instance_t *instance = wasm_instance_new(store, module, NULL);

    // 获取函数
    wasm_func_t *resize_func = wasm_instance_export_get_func(instance, "example:image/processor.resize");

    // 准备图像数据 (伪代码)
    uint8_t *image_data = load_jpeg("input.jpg", &width, &height);
    wasm_val_t args[3] = {
        WASM_PTR_VAL(image_data),
        WASM_I32_VAL(width),
        WASM_I32_VAL(height)
    };

    // 调用函数
    wasm_val_t results[1];
    wasm_func_call(resize_func, args, 3, results, 1);

    // 获取结果
    uint8_t *resized_data = results[0].of.ptr;
    save_jpeg("output.jpg", resized_data, width/2, height/2);
}

----------------------
JavaScript 调用
------------------
// 浏览器中运行
async function processImage() {
    // 加载Wasm模块
    const response = await fetch('image_processor_optimized.wasm');
    const buffer = await response.arrayBuffer();
    const module = await WebAssembly.compile(buffer);

    // 实例化
    const instance = await WebAssembly.instantiate(module);

    // 获取Canvas图像数据
    const canvas = document.getElementById('my-canvas');
    const ctx = canvas.getContext('2d');
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

    // 调用边缘检测
    const [processedData, newWidth, newHeight] =
        instance.exports['example:image/processor.apply-filter'](
            imageData.data,
            canvas.width,
            canvas.height,
            "edge_detect"
        );

    // 显示结果
    const newImage = new ImageData(
        new Uint8ClampedArray(processedData),
        newWidth,
        newHeight
    );
    ctx.putImageData(newImage, 0, 0);
}

----------------------
Rust 调用
-------------
use wasmtime::{Store, Module, Instance, Func, TypedFunc};
use std::fs;

fn main() {
    let wasm_bytes = fs::read("image_processor_optimized.wasm").unwrap();
    let engine = wasmtime::Engine::default();
    let module = Module::from_binary(&engine, &wasm_bytes).unwrap();
    let mut store = Store::new(&engine, ());
    let instance = Instance::new(&mut store, &module, &[]).unwrap();

    // 获取函数
    let apply_filter: TypedFunc<((Vec<u8>, u32, u32, String), (Vec<u8>, u32, u32))> =
        instance.get_typed_func(&mut store, "example:image/processor.apply-filter").unwrap();

    // 加载图像
    let image_data = std::fs::read("input.jpg").unwrap();
    let (width, height) = (800, 600); // 实际应从图像获取

    // 应用滤镜
    let (processed, new_width, new_height) =
        apply_filter.call(&mut store, (image_data, width, height, "grayscale".to_string())).unwrap();

    // 保存结果
    std::fs::write("output.jpg", processed).unwrap();
}

------------------------
真正的跨语言调用

同一 .wasm 文件可被 40+ 语言调用

无需为每种语言编写绑定

Python崩溃不会影响宿主程序

无法访问宿主文件系统(除非显式授权)









Q 75520266
回复

使用道具 举报

118

主题

728

帖子

4865

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4865
沙发
发表于 前天 02:49 | 只看该作者
python 在编程鄙视链的最底端(不含中文编程)。。。。
QQ 89075309
回复

使用道具 举报

0

主题

75

帖子

753

积分

高级会员

Rank: 4

积分
753
板凳
发表于 前天 07:49 | 只看该作者

感谢分享,很给力!~
回复

使用道具 举报

76

主题

1210

帖子

5445

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
5445
地板
发表于 前天 07:52 | 只看该作者
wasm 的优点:

可以使用 C/C++、Rust等语言编写代码,这个是 wasm 最大的价值所在;
高效快速,二进制文件,以接近原生的速度运行;
安全,和 JS 有相同的沙盒环境和安全策略,比如同源策略;
绝大多数主流浏览器支持。另外可移植,非浏览器环境也能支持(塞个 v8 进去,比如 nodejs);
使用其他语言的轮子。比如 Canvas 底层调用的 Skia C++ 库,就通过 wasm 技术提供了一个名为 CanvasKit 的 NPM 包给开发者用 JS 开发。
缺点:

适用场景较少,适合 CPU 密集型的场景(比如 3D 渲染);
提升并没有非常高(几十倍),通常可能就两三倍的样子?但对普通前端来说学习成本太高,还得看投入产出比;
和 JS 有通信的成本,通信频繁或数据量大会降低性能。
回复

使用道具 举报

35

主题

361

帖子

3128

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3128
5#
发表于 前天 09:15 | 只看该作者
还是先把c++的库搞定吧,基本都解决了.只要调用c++库更方便和兼容就行,然后提供自动补全和参数提示就好了.
回复

使用道具 举报

459

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
44564
6#
发表于 前天 09:55 | 只看该作者
解决不了封库问题
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

5

主题

73

帖子

1389

积分

金牌会员

Rank: 6Rank: 6

积分
1389
7#
发表于 前天 14:34 | 只看该作者
其实升级一下python支持库就行,现在的只支持python3.9的,太老了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-7-15 06:31 , Processed in 0.085252 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表