Important
Please participate in the survey here!
(open until end of February)
To achieve a better sample size, I'd highly appreciate if you could circulate the link to this survey in your own networks.
Note
This is one of 189 standalone projects, maintained as part of the @thi.ng/umbrella monorepo and anti-framework.
🚀 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
ES module import:
<script type="module" src="https://cdn.skypack.dev/@thi.ng/pixel-io-netpbm"></script>
For Node.js REPL:
const pixelIoNetpbm = await import("@thi.ng/pixel-io-netpbm");
Package sizes (brotli'd, pre-treeshake): ESM: 1.24 KB
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 from "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