【学Rust写CAD】26 图形像素获取(pixel_fetch.rs)

源码

rust 复制代码
use super::image::Image;

pub trait PixelFetch {
    fn get_pixel(bitmap: &Image,  x: i32,  y: i32) -> u32;
}

pub struct PadFetch;
impl PixelFetch for PadFetch{
    fn get_pixel(bitmap: &Image, mut x: i32, mut y: i32) -> u32 {
        if x < 0 {
            x = 0;
        }
        if x >= bitmap.width {
            x = bitmap.width - 1;
        }

        if y < 0 {
            y = 0;
        }
        if y >= bitmap.height {
            y = bitmap.height - 1;
        }

        bitmap.data[(y * bitmap.width + x) as usize]
    }
}

代码分析

这段代码定义了一个像素获取的 trait 和其实现,主要用于从图像中安全地获取像素值,同时处理越界访问的情况。以下是详细解释:

  1. 引入依赖和定义 trait
rust 复制代码
use super::image::Image;

pub trait PixelFetch {
    fn get_pixel(bitmap: &Image, x: i32, y: i32) -> u32;
}
  • use super::image::Image;: 引入父模块中的 Image 类型,表示图像数据结构。

  • PixelFetch trait: 定义了一个接口,要求实现 get_pixel 方法,用于从图像中获取指定坐标 (x, y) 的像素值(u32 类型)。

  1. 实现 PadFetch 结构体
rust 复制代码
pub struct PadFetch;
impl PixelFetch for PadFetch {
    fn get_pixel(bitmap: &Image, mut x: i32, mut y: i32) -> u32 {
        // 处理 x 越界
        if x < 0 {
            x = 0;
        }
        if x >= bitmap.width {
            x = bitmap.width - 1;
        }

        // 处理 y 越界
        if y < 0 {
            y = 0;
        }
        if y >= bitmap.height {
            y = bitmap.height - 1;
        }

        // 返回安全坐标下的像素值
        bitmap.data[(y * bitmap.width + x) as usize]
    }
}
  • PadFetch: 一个空结构体,实现了 PixelFetch trait,提供边界填充(Padding)的像素获取策略。

  • 越界处理逻辑:

    • 如果 x 或 y 为负数,将其修正为 0(图像左/上边界)。

    • 如果 x 或 y 超过图像宽度或高度,将其修正为 width - 1 或 height - 1(图像右/下边界)。

  • 像素计算: 修正后的坐标通过 y * width + x 转换为线性索引,从 bitmap.data(像素数组)中取出对应的 u32 像素值。

关键点总结

  • 用途: 安全地获取图像像素,避免因越界访问导致 panic 或内存不安全。

  • 策略: 越界时返回最近的边界像素值(类似"边缘填充"效果)。

  • 适用场景: 图像处理中需要处理边界条件的操作(如卷积滤波、缩放等)。

如果需要其他边界处理方式(如镜像、重复等),可以定义新的结构体并实现 PixelFetch trait。

相关推荐
怪我冷i7 小时前
Rust 的impl语法详解
开发语言·后端·rust
geovindu11 小时前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
Thneonl13 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
怪我冷i1 天前
Rust 智能指针 RefCell<T> 与内部可变性模式
rust
YOLOW922 天前
两周五个版本:我用 Rust 写的 AI 数据引擎 PageSift,0.81 系列做了什么
rust
西风测评2 天前
SSH 中文乱码的根源:locale、SendEnv 与 env 请求
rust
unconditional2 天前
我数了下 sdkm 的源码:41 个工具的安装逻辑,四分之三是同一行
rust·开源
海绵宝宝的月光宝盒2 天前
14-AutoCAD-阵列命令应用与案例实战(AR)
经验分享·笔记·自动化·课程设计·制造·学习方法·cad
niyongsheng2 天前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
Hello.Reader2 天前
tsrs 技术解析用 Rust 移植 TypeScript 7,类型检查还能怎样提速?
开发语言·rust·typescript