can I display a JPG or PNG to the framebuffer (/dev/fb*)?

19

3

I know I can capture the framebuffer in linux using something like cp /dev/fb0 ~/myimage and re-display that by coping back to the device like so cp ~/myimage /dev/fb0. What format is the framebuffer image data in? and how would I go about displaying a pre-made image (jpg, png) to the framebuffer? Can I convert to this format using imagemagick?

p.s. Im using a raspberry pi running raspbian.



Update 11-12-2012

I ended up using pygame to display images in my application. Not sure if this uses the frame-buffer to display the images. But it meets my needs quite well.

ndmweb

Posted 2012-10-30T04:01:24.747

Reputation: 341

Answers

8

Have you tried Fbida?

fbida contains fbi, an image viewer for the framebuffer.

Link to fbi man page - http://manpages.ubuntu.com/manpages/lucid/man1/fbi.1.html

P.S - I am not sure whether it will work in Raspbian.

VenkatH

Posted 2012-10-30T04:01:24.747

Reputation: 606

Unfortunately it doesn't seem to be possible to prevent 'fbi' from displaying a status bar at the bottom of the screen. This is a bit of a showstopper for various applications... – Jules – 2013-05-23T07:46:41.210

3@Jules On Debian 8 (testing), there is a -noverbose option which makes it display just the image itself; however, this is not documented in the man page, but is only in the "usage:" for the it. – Abbafei – 2013-06-23T08:32:26.217

Does it work? I previously built a copy from the source on the author's web page, and that did have the option, but the option did not seem to actually do anything at all in that version. – Jules – 2013-06-27T16:54:46.707

@Jules -noverbose works for me using fbi on raspbian when I installed it using apt-get install fbi. – D. Woods – 2013-07-30T09:12:26.093

3

it might help you, detailed manual http://hacklab.cz/2012/04/22/usefulness-linux-framebuffer-virtual-console I think it has all in one place about Linux Framebuffer

MichaelHefner

Posted 2012-10-30T04:01:24.747

Reputation: 51

2

What format is the framebuffer image data in?

The Linux kernel 4.2 documentation https://github.com/torvalds/linux/blob/v4.2/Documentation/fb/api.txt#45 says:

Pixels are stored in memory in hardware-dependent formats. Applications need to be aware of the pixel storage format in order to write image data to the frame buffer memory in the format expected by the hardware.

Formats are described by frame buffer types and visuals. Some visuals require additional information, which are stored in the variable screen information bits_per_pixel, grayscale, red, green, blue and transp fields.

Visuals describe how color information is encoded and assembled to create macropixels. Types describe how macropixels are stored in memory. The following types and visuals are supported.

A list of visuals and types follows, but the description is not enough for me to understand the exact formats immediately.

Ciro Santilli 新疆改造中心法轮功六四事件

Posted 2012-10-30T04:01:24.747

Reputation: 5 621

1@Downvoters please explain so I can learn and improve info. I never retaliate. Thanks. – Ciro Santilli 新疆改造中心法轮功六四事件 – 2017-04-19T12:18:03.600

1

If you want to cp /dev/fb0 ~/myimage, the image should only contain the pixels information,and the order should be right (RGB, BGR, RGBA, ARGB...)

I want to do this too,but did not find a suitable tool, so I use python to help me pre-made the image. You can try this.

zqb-all

Posted 2012-10-30T04:01:24.747

Reputation: 81

1

If you can install them, fbcat will create a ppm image, and fbgrab will create a png image.

Yves Dorfsman

Posted 2012-10-30T04:01:24.747

Reputation: 175

0

Look at /usr/include/linux/fb.h at structs like fb_var_screeninfo. There can be a variety of color depths and formats. I see 16 bits/pixel way too often, right now I have 32. Type fbset by itself and it will display the current settings. Which will almost certainly be one of the entries in /etc/fb.modes.

upstairs# fbset

mode "1920x1080"
    geometry 1920 1080 1920 1080 32
    timings 0 0 0 0 0 0 0
    rgba 8/16,8/8,8/0,8/24
endmode

Imagemagick might work if you can make it match exactly the mode you need. I'd probably write something in C, a dozen or so lines calling libjpeg or libpng can decompress an image into a memory array. Your bits/color etc. needs to match or you need to write something to convert it. Good experience.

Also rather than reading/writing /dev/fb0 as a file, open() it to get a file descriptor then mmap() it so you're working with a pointer to the memory. It's much faster at doing transfers, at least 10x.

But for putting images on the screen I just install qiv. Then hit F1 for help, but an x while displaying an image will write it semi-permanently to the root window if that's what you want. Or just set it as wallpaper in Desktop Preferences and it will come up every boot.

Alan Corey

Posted 2012-10-30T04:01:24.747

Reputation: 9

Mine's ARGB apparently (Raspbian). I started with HTML-type colors from a GIMP color picker, took 4 tries to get it right. – Alan Corey – 2019-02-20T19:36:20.163