summary refs log tree commit diff
path: root/pfm.html
blob: 2ea670b56173015e9fe928d76cd3d7cef110644f (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
93
94
95
96
97
98
99
100
101
102
<!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: 27 February 2024
<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.  This format appears to be the one Gimp calls PFM.

Another important PFM is used by Adobe Photoshop and appears to be identical
to this except that rows are ordered from top to bottom in the Adobe version.
If you interchange images between systems that use these two formats, it will
work except that your image gets flipped upside down.  You can compensate for
that with <kbd>pamflip -topbottom</kbd>.

<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.

<em>Note:</em> This is the opposite of Netpbm formats, which order rows
top to bottom.  It is also the opposite of the format Adobe Photoshop calls
PFM.  See the introduction for more information on this disparity.
  
<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>