17个版本

0.3.5 2024年1月4日
0.3.4 2022年8月16日
0.3.3 2022年7月27日
0.3.0 2021年11月2日
0.1.3 2019年3月2日

#45图像 类别中排名

Download history 62/week @ 2024-04-08 107/week @ 2024-04-15 48/week @ 2024-04-22 92/week @ 2024-04-29 298/week @ 2024-05-06 154/week @ 2024-05-13 232/week @ 2024-05-20 135/week @ 2024-05-27 193/week @ 2024-06-03 125/week @ 2024-06-10 80/week @ 2024-06-17 327/week @ 2024-06-24 34/week @ 2024-07-01 51/week @ 2024-07-08 165/week @ 2024-07-15 125/week @ 2024-07-22

每月425次下载
5 个crate 使用

MIT/Apache

165KB
2.5K SLoC

psd

Build status docs

用于解析和操作PSD文件的Rust API。

在线演示

psd crate可以编译为WebAssembly并在浏览器中使用。

在线演示中,您可以在浏览器中可视化PSD文件,切换图层开/关,并将新的PSD拖放到演示中。

Demo screenshot

请参阅examples/drag-drop-browser目录中的说明,了解如何在本地运行演示。

PSD图书

WIP PSD图书 将包含有关如何开始使用 psd crate 的信息,架构描述以及如何开始的信息。

API文档

请查看API文档以了解您目前可以访问的所有内容。

背景/初始动机

我正在制作一个游戏,我的资源编译过程的一部分是一个脚本,该脚本执行以下操作

  1. 遍历所有PSD文件

  2. 将每个PSD导出为PNG,忽略以 _ 开头的任何图层

  3. 将PNG组合成纹理图集

我在使用 imagemagick 的几年里一直用它来执行步骤2,但在我升级到新笔记本电脑和 imagemagick 版本后,它停止工作。

经过一番谷歌搜索,我找不到解决问题的方案,所以我决定创建这个crate。

我的方法是在需要的情况下支持尽可能多的PSD规范,因此可能有一些您希望利用但尚未支持的信息。

尽管如此,如果您缺少任何需要的内容,请非常欢迎您提出问题

用法

use psd::{ColorMode, Psd, PsdChannelCompression};

fn main () {
    // .. Get a byte slice of PSD file data somehow ..
    let psd = include_bytes!("./my-psd-file.psd");

    let psd = Psd::from_bytes(psd).unwrap();

    assert_eq!(psd.color_mode(), ColorMode::Rgb);

    // For this PSD the final combined image is RleCompressed
    assert_eq!(psd.compression(), &PsdChannelCompression::RleCompressed);

    assert_eq!(psd.width(), 500);
    assert_eq!(psd.height(), 500);

    // Get the combined final image for the PSD.
    let final_image: Vec<u8> = psd.rgba();

    for layer in psd.layers().iter() {
        let name = layer.name();

        let pixels: Vec<u8> = layer.rgba().unwrap();
    }

    let green_layer = psd.layer_by_name("Green Layer").unwrap();

    // In this layer the red channel is uncompressed
    assert_eq!(green_layer.compression(&PsdChannelKind::Red).unwrap(), PsdChannelCompression::RawData);

    // In this layer the green channel is RLE compressed
    assert_eq!(green_layer.compression(&PsdChannelKind::Green).unwrap(), PsdChannelCompression::RleCompressed);

    // Combine the PSD layers top to bottom, ignoring any layers that begin with an `_`
    let pixels: Vec<u8> = psd.flatten_layers_rgba(&|(_idx, layer)| {
        !layer.name().starts_with("_")
    }).unwrap();
}

另请参阅

许可证

MIT

依赖项

~285–750KB
~18K SLoC