summary refs log tree commit diff
path: root/pfm.html
blob: 5f91674dbac8cf211c2977df4f01498ad7ad0234 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.3//EN">
<html>
<head><title>PFM Format Description</title>
<meta name="manual_section" content="5">
</head>
<body>
<h1>pfm</h1>
Updated: 19 April 2012
<h2>NAME</h2>

PFM - PFM graphic image file format

<h2>DESCRIPTION</h2>

<p>
This document describes the PFM graphic image file format as understood by
the Netpbm converters <a href="pamtopfm.html"><b>pamtopfm</b></a> and
<a href="pfmtopam.html"><b>pfmtopam</b></a>.

<p>There are multiple similar formats known as PFM in the world, none
of them authoritatively documented.  The format described here is one
that Bryan Henderson deduced from a program he found somewhere that
dealt with a "PFM" format.

<p>The PFM format is inspired by the Netpbm formats, and you will see
lots of similarity.  It is not, however, an official Netpbm format.
Its goal is not consistent with those of Netpbm formats.

<h2>The format</h2>

<p>A PFM image is a stream of bytes.  The stream consists of a header
followed immediately by a raster.  These two components are described
below.  There are no delimiters before or after the sections as
described.

<h3>PFM header</h3>

<p>The PFM header is 3 consecutive "lines" of ASCII text.
After each line is a white space character.  That character is
typically a newline character, hence the term "line," but
doesn't have to be.

<p><b>pamtopfm</b> uses a newline in the PFM it generates.

<h4>Identifier Line</h4>

<p>The identifier line contains the characters "PF" or
"Pf".  PF means it's a color PFM.  Pf means it's a grayscale
PFM.

<h4>Dimensions Line</h4>

<p>The dimensions line contains two positive decimal integers,
separated by a blank.  The first is the width of the image; the second
is the height.  Both are in pixels.

<h4>Scale Factor / Endianness</h4>

<p>The Scale Factor / Endianness line is a queer line that jams
endianness information into an otherwise sane description of a scale.
The line consists of a nonzero decimal number, not necessarily an
integer.  If the number is negative, that means the PFM raster is
little endian.  Otherwise, it is big endian.  The absolute value of
the number is the scale factor for the image.

<p>The scale factor tells the units of the samples in the raster.  You
use somehow it along with some separately understood unit information
to turn a sample value into something meaningful, such as watts per
square meter.


<h3>PFM raster</h3>

<p>The raster is a sequence of pixels, packed one after another, with no
delimiters of any kind.  They are grouped by row, with the pixels in each
row ordered left to right and the rows ordered bottom to top.

<p>Each pixel consists of 1 or 3 samples, packed one after another,
with no delimiters of any kind.  1 sample for a grayscale PFM and 3 for a
color PFM (see the Identifier Line of the PFM header).

<p>Each sample consists of 4 consecutive bytes.  The bytes represent a
32 bit string, in either big endian or little endian format, as determined
by the Scale Factor / Endianness line of the PFM header.  That string is
an IEEE 32 bit floating point number code.  Since that's the same format
that most CPUs and compiler use, you can usually just make a program use
the bytes directly as a floating point number, after taking care of the
endianness variation.

</body>
</html>