当前位置: 首页 > news >正文

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

源码

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
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 结构体
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。

http://www.dtcms.com/a/106558.html

相关文章:

  • 红日靶场一实操笔记
  • C++ QT 如何生成dll提供給python使用
  • 星途​(小说)
  • 零欧姆电阻的作用、使用场景及注意事项详解
  • PyTorch 核心详解
  • 第六章、Isaacsim中的资产(usd)
  • 【嵌入式系统设计师】知识点:第1章 计算机系统基础知识
  • 方案精读:IPD业务流程体系构建(中)【附全文阅读】
  • 介绍一点metric self-join和复合索引笔记
  • 数组中两个字符串的最小距离
  • 【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
  • CCF CSP 第34次(2024.06)(2_矩阵重塑(其二)_C++)(二维矩阵 -> 一维矩阵 -> 二维矩阵)
  • 【万字总结】前端全方位性能优化指南(九)——FSP(First Screen Paint)像素级分析、RUM+合成监控、Lighthouse CI
  • 蓝桥杯C++基础算法-最大公约数
  • 论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard
  • 电池自动点焊机:智能制造的得力助手|深圳比斯特自动化
  • 普通链式二叉树(习题版)
  • 脑影像分析软件推荐| SimTB
  • WireShark安装
  • BigMusic来了:火山引擎AI音乐模型的技术革新与应用实践
  • MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
  • Doris:打破 SQL 方言壁垒,构建统一数据查询生态
  • TensorFlow 字符串操作
  • Uubuntu20.04复现SA-ConvONet步骤
  • 【2025】物联网发展趋势介绍
  • 制造业数字化转型:智能招聘系统破解蓝领用工匹配难题?
  • MySQL学习笔记集--简单介绍以及下载途径
  • EdgeOne Pages 上线「DeepSeek R1 模板」,1分钟快速部署对话型 AI 类网站
  • MySQL表的增删改查(进阶)
  • 应华为 AI 医疗军团之战,各方动态和反应