Screen shut /dev/fb0 C

Fórumok

Screen shut /dev/fb0 C

Hozzászólások

Igen.
A /dev/fb0 fájlon keresztül a framebuffer adatait (pixelek - RGBA) közvetlenül, akár az ablakkezelőt megkerülve, el lehet érni...

Az mmap() hivassal be is van kotve memoriaba;
Odaig mondjuk van elkepzelesem hogy,hogyan olvasom ki a pixeleket,csak azt nem tudom hogy hogy lehet abbol majd kepet letrehozni?

Sziasztok.

OP:UHU 1.2
A kovetkezo temaban szeretnem a segitsegeteket kerni:
[code:1:93e82326dd]
/*.........................*/
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information.\n");
exit(1);
}
screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
fbfd, 0);

/*.........................*/
[/code:1:93e82326dd]

Hogya lehet a pixeleket kiolvasni? es kep formaban -bmp?- elmenteni?

Minden segitseget koszonok!

Ennyire jutottam :



/* /dev/fb* screen shut*/

#include <linux/fb.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

#include "bitmap.h"


int main(int argc, char **argv)
{
    int framebuffer_device;
    int line_size, buffer_size;
    
    int *screen_memory;
    struct fb_var_screeninfo vinfo;

    if ((framebuffer_device = open("/dev/fb0", O_RDWR)) == -1) {
	perror("open /dev/fb* ");
	exit(1);
    }

    if (ioctl(framebuffer_device, FBIOGET_VSCREENINFO, &vinfo) == -1) {
	perror("ioctl FBIOGET_VSCREENINFO ");
	exit(1);
    }


    buffer_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
    vinfo.xoffset = 0;
    vinfo.yoffset = 0;
    /*
     * if ( ioctl(framebuffer_device, FBIOPAN_DISPLAY, &vinfo) == -1) {
     * perror("ioctl FBIOPAN_DISPLAY "); exit(1); } 
     */
    screen_memory = (char *)(mmap(0, buffer_size
                        + 512, PROT_READ | PROT_WRITE, MAP_SHARED,
                        framebuffer_device, 0)) + 512; 

    printf(" buffer size = %d\n line size = %d\n ", buffer_size,
	   line_size);

    /*bmp fejlec 
     */
    TBMPHead bmp_head;

    bmp_head.FileHeader.bfSize = sizeof(TBMPFileHeader);
    bmp_head.FileHeader.bfType = 0x4d42;	/* BM */

    bmp_head.InfoHeader.biSize = sizeof(TBMPInfoHeader);
    bmp_head.InfoHeader.biWidth = vinfo.xres;
    bmp_head.InfoHeader.biHeight = vinfo.yres;
    bmp_head.InfoHeader.biPlanes = 1;
    bmp_head.InfoHeader.biBitCount = 16;
    bmp_head.InfoHeader.biCompression = 0x00000003;	/* BI_BITFIELDS */
    bmp_head.InfoHeader.biSizeImage = 0;
    bmp_head.InfoHeader.biXPelsPerMeter = 0;	//vinfo.xres;
    bmp_head.InfoHeader.biYPelsPerMeter = 0;	//vinfo.yres;
    bmp_head.InfoHeader.biClrUsed = 0;
    bmp_head.InfoHeader.biClrImportant = 0;


    int seek_ret, fd = open("./kep.bmp", (O_RDWR | O_CREAT));
    write(fd, &bmp_head, sizeof(TBMPHead));
    /*& ~S_IROTH */
    printf("sizeof(TBMPInfoHeader) = %d byte\n", sizeof(TBMPInfoHeader));
    printf(" sizeof(TBMPFileHeader) = %d byte\n", sizeof(TBMPFileHeader));
    

    if ((off_t) (seek_ret = lseek(fd, sizeof(TBMPHead), SEEK_SET)) != -1) {
	printf(" screen_memory = %d \n", screen_memory);
	
	write(fd, screen_memory, buffer_size);
	
	close(fd);
    } else {
	perror("lseek:");
	exit(1);
    }

    munmap(screen_memory, buffer_size);
    return 0;
}

Az eredmeny -ha valamelyik vt 'fenykepezem'- egy majdnem tokeletes kep fejleg:-)Mar csak meg kellene forditani a fileba irast...

Megj: NEM jelenik meg a bongeszoben a #inculde utani resz -az elso sorokban-,lehet hogy a "< >" jelek bekavarnak...?