Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
FARBFELD(5)		       File Formats Manual		     FARBFELD(5)

NAME
     farbfeld -- suckless image format

DESCRIPTION
     farbfeld  is  a lossless image format which is easy to parse, pipe and com-
     press.  It has the following format:

     BYTES    DESCRIPTION
     8	      "farbfeld" magic value
     4	      32-Bit BE unsigned integer (width)
     4	      32-Bit BE unsigned integer (height)
     [2222]   4*16-Bit BE unsigned integers [RGBA] / pixel, row-major

     The RGB-data should be sRGB for best interoperability and not alpha-premul-
     tiplied.

USAGE
     farbfeld provides the tools 2ff(1),  jpg2ff(1),  png2ff(1)  and  ff2jpg(1),
     ff2pam(1),  ff2png(1), ff2ppm(1) to convert to and from farbfeld images re-
     spectively.

     bzip2(1) is recommended for compression, giving results comparable with PNG
     for photographs and much better results for other image types.

     The file extension is ".ff" and compression extensions  shall  be	appended
     (e.g. ".ff.bz2").

MOTIVATION
     farbfeld  was created because the author was not satisfied with the boiler-
     plate and inherent complexity involved in	handling  common  image  formats
     (PNG,  JPEG,  GIF,...), having to rely on bloated libraries while not being
     able to focus on the task at hand for a given image processing problem.

EXAMPLES
     The following code listing invert.c is a ready-to-use color  inverter  with
     all  necessary error handling and reporting. This program can be integrated
     into a farbfeld pipeline as follows:

     $ png2ff < image.png | invert | ff2png > image-inverted.png

     It shall be noted here that due to the simplicity of the format no external
     libraries are needed to handle the farbfeld image	data.  The  0BSD-License
     gives you the freedom to throw away the license block and just use the code
     as you wish. Happy hacking!

     /*
      * 0BSD-License
      *
      * (c) 2017 Laslo Hunhold <dev@frign.de>
      *
      * Permission to use, copy, modify, and/or distribute this software for
      * any purpose with or without fee is hereby granted.
      *
      * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
      * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
      * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
      * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
      * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
      * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
      * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
      * PERFORMANCE OF THIS SOFTWARE.
      */
     #include <arpa/inet.h>

     #include <errno.h>
     #include <stdint.h>
     #include <stdio.h>
     #include <string.h>

     #define LEN(x) (sizeof (x) / sizeof *(x))

     static void
     invert(uint16_t rgba[4])
     {
	     rgba[0] = UINT16_MAX - rgba[0];
	     rgba[1] = UINT16_MAX - rgba[1];
	     rgba[2] = UINT16_MAX - rgba[2];
     }

     int
     main(int argc, char *argv[])
     {
	     uint32_t hdr[4], width, height, i, j, k;
	     uint16_t rgba[4];

	     /* arguments */
	     if (argc != 1) {
		     fprintf(stderr, "usage: %s\n", argv[0]);
		     return 1;
	     }

	     /* read header */
	     if (fread(hdr, sizeof(*hdr), LEN(hdr), stdin) != LEN(hdr)) {
		     goto readerr;
	     }
	     if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) {
		     fprintf(stderr, "%s: invalid magic value\n", argv[0]);
		     return 1;
	     }
	     width = ntohl(hdr[2]);
	     height = ntohl(hdr[3]);

	     /* write data */
	     if (fwrite(hdr, sizeof(*hdr), LEN(hdr), stdout) != 4) {
		     goto writerr;
	     }

	     for (i = 0; i < height; i++) {
		     for (j = 0; j < width; j++) {
			     if (fread(rgba, sizeof(*rgba), LEN(rgba),
				       stdin) != LEN(rgba)) {
				     goto readerr;
			     }
			     for (k = 0; k < 4; k++) {
				     rgba[k] = ntohs(rgba[k]);
			     }

			     invert(rgba);

			     for (k = 0; k < 4; k++) {
				     rgba[k] = htons(rgba[k]);
			     }
			     if (fwrite(rgba, sizeof(*rgba), LEN(rgba),
					stdout) != LEN(rgba)) {
				     goto writerr;
			     }
		     }
	     }

	     /* clean up */
	     if (fclose(stdout)) {
		     fprintf(stderr, "%s: fclose: %s\n", argv[0],
			     strerror(errno));
		     return 1;
	     }

	     return 0;
     readerr:
	     fprintf(stderr, "%s: fread: Unexpected EOF\n", argv[0]);
	     return 1;
     writerr:
	     fprintf(stderr, "%s: fwrite: %s\n", argv[0], strerror(errno));
	     return 1;
     }

SEE ALSO
     2ff(1), ff2jpg(1), ff2pam(1), ff2png(1), ff2ppm(1), jpg2ff(1), png2ff(1)

AUTHORS
     Laslo Hunhold <dev@frign.de>

suckless.org			   2018-04-11			     FARBFELD(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=farbfeld&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help