Note
This is one of 199 standalone projects, maintained as part of the @thi.ng/umbrella monorepo and anti-framework.
🚀 Please help me to work full-time on these projects by sponsoring me on GitHub. Thank you! ❤️
Multi-format NetPBM reader & writer support for @thi.ng/pixel.
This package can read & write binary
NetPBM image formats from byte
arrays/buffers to
@thi.ng/pixel
pixel buffers (aka PackedBuffer
).
Source format | Destination format | Rec. file extension(1) |
---|---|---|
1 bit | GRAY8 (2) |
.pbm |
2-8 bit grayscale | GRAY8 |
.pgm |
9-16 bit grayscale | GRAY16 |
.pgm |
24 bit RGB | ARGB8888 |
.ppm |
(1) no relevance to actual parse/export logic (2) currently no support for actual 1-bit pixel buffers
Furthermore the parseHeader()
function can be used to just extract image type,
size and other meta data (from comments), without parsing the full image.
STABLE - used in production
Search or submit any issues for this package
yarn add @thi.ng/pixel-io-netpbm
ESM import:
import * as pbm from "@thi.ng/pixel-io-netpbm";
Browser ESM import:
<script type="module" src="https://esm.run/@thi.ng/pixel-io-netpbm"></script>
For Node.js REPL:
const pbm = await import("@thi.ng/pixel-io-netpbm");
Package sizes (brotli'd, pre-treeshake): ESM: 1.24 KB
Note: @thi.ng/api is in most cases a type-only import (not used at runtime)
One project in this repo's /examples directory is using this package:
Screenshot | Description | Live demo | Source |
---|---|---|---|
Multi-layer vectorization & dithering of bitmap images | Demo | Source |
import * as pbm from "@thi.ng/pixel-io-netpbm";
import * as fs "node:fs";
const src = fs.readFileSync("a.pbm");
// <Buffer 50 34 0a 23 20 67 65 6e 65 72 61 74 65 64 20 62 79...>
// parse image header data
// P4 type => 1bit bitmap
pbm.parseHeader(src)
// {
// type: 'P4',
// width: 12,
// height: 8,
// max: undefined,
// start: 47,
// comments: [ 'generated by @thi.ng/pixel-io-netpbm' ]
// }
const img = pbm.read(src);
// IntBuffer {
// width: 12,
// height: 8,
// format: [Object],
// data: Uint8Array(96) [
// 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
// 255, 255, 255, 0, 0, 255, 255, 255, 255, 255, 0, 255,
// 255, 255, 0, 0, 0, 0, 255, 255, 255, 0, 0, 255,
// 255, 0, 0, 255, 255, 0, 0, 255, 0, 0, 0, 255,
// 255, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 255,
// 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255,
// 255, 0, 0, 255, 255, 0, 0, 255, 255, 255, 0, 255,
// 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
// ]
// }
// convert to RGB image and export w/ additional meta data
// (will be stored in PBM header comments)
fs.writeFileSync(
"a-rgb.ppm",
pbm.asPPM(
img.as(RGB888),
[
"@prefix dc: http://purl.org/dc/terms/",
"dc:created 2021-02-08",
"dc:creator toxi"
]
)
);
If this project contributes to an academic publication, please cite it as:
@misc{thing-pixel-io-netpbm,
title = "@thi.ng/pixel-io-netpbm",
author = "Karsten Schmidt",
note = "https://thi.ng/pixel-io-netpbm",
year = 2021
}
© 2021 - 2024 Karsten Schmidt // Apache License 2.0