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 在 图像 类别中排名
每月425次下载
被 5 个crate 使用
165KB
2.5K SLoC
psd
用于解析和操作PSD文件的Rust API。
在线演示
psd
crate可以编译为WebAssembly并在浏览器中使用。
在在线演示中,您可以在浏览器中可视化PSD文件,切换图层开/关,并将新的PSD拖放到演示中。
请参阅examples/drag-drop-browser目录中的说明,了解如何在本地运行演示。
PSD图书
WIP PSD图书 将包含有关如何开始使用 psd
crate 的信息,架构描述以及如何开始的信息。
API文档
请查看API文档以了解您目前可以访问的所有内容。
背景/初始动机
我正在制作一个游戏,我的资源编译过程的一部分是一个脚本,该脚本执行以下操作
-
遍历所有PSD文件
-
将每个PSD导出为PNG,忽略以
_
开头的任何图层 -
将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();
}
另请参阅
- PSD规范 - 我们API的基础
许可证
MIT
依赖项
~285–750KB
~18K SLoC