专栏首页Rust语言学习交流image-rs - Rust下的图像处理库

image-rs - Rust下的图像处理库

本期带来的是Rust下的图像处理库,image-rs。

  • Github: image-rs repo
  • Docs rs: image-rs doc

根据Github仓库页面的介绍,image-rs提供了基础的图像处理功能和图像格式转换功能。

所有的图像处理函数都通过GenericImageImageBuffer完成。

image-rs支持的图像格式如下:

从上图我们可以看出image-rs基本支持了应用中常见的图像容器格式类型。

关于ImageDecoderImageDecoderExt 所有的图像格式decoders都包含了ImageDecoder实现,其中主要过程是从图像文件中获取图像的metadata并解码图像。

其中一些decoders的比较重要的参数包括:

  • dimensions:返回包含图像的宽度和高度的元组数据
  • color_type:返回由decoder返回的图像的色彩类型
  • read_image:把图像解码成bytes

关于像素,image提供了如下几种像素类型:

  • Rgb: 包含Rgb像素
  • Rgba: 包含Rgba像素(a为alpha,透明通道)
  • Luma: 灰度像素
  • LumaA: 包含alpha通道的灰度像素

图像处理函数包含:

  • blur:使用高斯模糊来处理图像
  • brighten:图像高亮处理
  • huerotate: 旋转色彩空间
  • contrast: 调整图像的对比度
  • crop: 剪裁图像
  • filter3x3:使用3x3的矩阵来处理图像,可用于图像降噪,升噪
  • grayscale: 灰度化图像
  • flip_horizontal: 水平翻转图像
  • flip_vertical: 垂直翻转图像
  • invert: 对图像的每个像素求反
  • resize: 改变图像尺寸
  • rotate180: 图像顺时针旋转180度
  • rotate270: 图像顺时针旋转270度
  • rotate90: 图像顺时针
  • unsharpen: 降低图像锐度

下面我们通过image-rs Github仓库的Generating Fractals例子来试用image-rs库

开发环境:

  • Windows 10
  • cargo --version: 1.39.0
  • rustc --version: 1.39.0

根据示例代码,只需要在dependencies中添加引用

[dependencies]
image = "0.23.4"
num-complex = "0.2.4"

修改源文件main.rs如下

extern crate image;
extern crate num_complex;

fn main() {
    let imgx = 800;
    let imgy = 800;

    let scalex = 3.0 / imgx as f32;
    let scaley = 3.0 / imgy as f32;

    // Create a new ImgBuf with width: imgx and height: imgy
    let mut imgbuf = image::ImageBuffer::new(imgx, imgy);

    // Iterate over the coordinates and pixels of the image
    for (x, y, pixel) in imgbuf.enumerate_pixels_mut() {
        let r = (0.3 * x as f32) as u8;
        let b = (0.3 * y as f32) as u8;
        *pixel = image::Rgb([r, 0, b]);
    }

    // A redundant loop to demonstrate reading image data
    for x in 0..imgx {
        for y in 0..imgy {
            let cx = y as f32 * scalex - 1.5;
            let cy = x as f32 * scaley - 1.5;

            let c = num_complex::Complex::new(-0.4, 0.6);
            let mut z = num_complex::Complex::new(cx, cy);

            let mut i = 0;
            while i < 255 && z.norm() <= 2.0 {
                z = z * z + c;
                i += 1;
            }

            let pixel = imgbuf.get_pixel_mut(x, y);
            let image::Rgb(data) = *pixel;
            *pixel = image::Rgb([data[0], i as u8, data[2]]);
        }
    }

    // Save the image as “fractal.png”, the format is deduced from the path
    imgbuf.save("fractal.png").unwrap();
}

使用命令cargo build编译,使用命令cargo run运行,即可在工程根目录下生成名为fractal.png的图片

本文分享自微信公众号 - Rust语言学习交流(rust-china)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Rust日报】 2019-09-27:async-std v0.99.7 released

    MikeLoveRust
  • 【Rust精彩blog】Rust 中几个智能指针的异同与使用场景

    想必写过 C 的程序员对指针都会有一种复杂的情感,与内存相处的过程中可以说是成也指针,败也指针。一不小心又越界访问了,一不小心又读到了内存里的脏数据,一不小心多...

    MikeLoveRust
  • 【Rust每周一库】sled - 嵌入式数据库

    Sled是基于Bw树构建的嵌入式KV数据库,其API接近于一个线程安全的BTreeMap<[u8], [u8]>。而其Bw树的数据结构加上包括crossbeam...

    MikeLoveRust
  • 腾讯云和Azure VPC互通配置

    此处仅描述了部署在腾讯云的网关和控制台建立连接的过程,但同样适用于腾讯云,AWS,百度云,华为云。

    Accesshub
  • 营销观点 | 谈谈以内容为核心的SaaS市场运营体系

    ? ? 产品是硬,内容是软,软硬结合才能构成一个完整的产品。让我们跟随作者一起来探讨以内容为核心的SaaS市场运营体系吧~ ? 一、内容运营的关键数据是什么?...

    腾讯企点
  • 经典游戏服务器端架构概述(下)

    经典游戏服务器端架构概述(下) 今天将详细说明全服分线模型和全服全线模型,正文如下: 1全服分线模型 一、模型描述 由于多进程服务器模型的发展,游戏开发者...

    韩伟
  • 【图文】腾讯云服务器CVM如何安装宝塔面板?

    教程目的:帮助小白用户,快速学会安装宝塔控制面板,并通过宝塔控制面板快速搭建建站环境。

    弦山
  • 经典游戏服务器端架构概述 (2)

    现代电子游戏,基本上都会使用一定的网络功能。从验证正版,到多人交互等等,都需要架设一些专用的服务器,以及编写在服务器上的程序。因此,游戏服务器端软件的架构,本质...

    韩伟
  • 精通React/Vue系列之实现一个全局提示(Message)组件

    本文是笔者写组件设计的第十一篇文章, 今天带大家实现一个同样比较特殊的组件——全局提示(Message)组件。我们看到的组件效果可能是这样的:

    徐小夕
  • 支招 | 用 PyTorch 1.2 构建一个神经网络模型

    原标题 | A Gentle Introduction to PyTorch 1.2

    AI研习社

扫码关注云+社区

领取腾讯云代金券