嵌入式linux截屏代码,嵌入式linux截屏程序
基于網上一個代碼改的。
源地址:http://blog.csdn.net/z1179675084/article/details/14645359
// 注意,由于fb_bpp = 16的情況沒用到,以下修改后的代碼只調整了fb_bpp不為16的情況
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static unsigned int capframe = 0;
static unsigned char filename[30];
FILE *bmpFile;
unsigned char bmp_head_t[] = {
0x42,0x4d,0x42,0x58,0x02,0x00,0x00,0x00,0x00,0x00,
0x42,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0xf0,0x00,
0x00,0x00,0x40,0x01,0x00,0x00,0x01,0x00,0x10,0x00,
0x03,0x00,0x00,0x00,0x00,0x58,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0xe0,0x07,
0x00,0x00,0x1f,0x00,0x00,0x00
};
static int fb_bpp;
//14byte
typedef struct
{
char cfType[2]; /* 文件類型, 必須為 "BM" (0x4D42)*/
unsigned int cfSize; /* 文件的大小(字節) */
unsigned int cfReserved; /* 保留, 必須為 0 */
unsigned int cfoffBits; /* 位圖陣列相對于文件頭的偏移量(字節)*/
}__attribute__((packed)) BITMAPFILEHEADER; /* 文件頭結構 */
//40byte
typedef struct
{
unsigned int ciSize; /* size of BITMAPINFOHEADER */
unsigned int ciWidth; /* 位圖寬度(像素) */
unsigned int ciHeight; /* 位圖高度(像素) */
unsigned short ciPlanes; /* 目標設備的位平面數, 必須置為1 */
unsigned short ciBitCount; /* 每個像素的位數, 1,4,8或24 */
unsigned int ciCompress; /* 位圖陣列的壓縮方法,0=不壓縮 */
unsigned int ciSizeImage; /* 圖像大小(字節) */
unsigned int ciXPelsPerMeter;/* 目標設備水平每米像素個數 */
unsigned int ciYPelsPerMeter;/* 目標設備垂直每米像素個數 */
unsigned int ciClrUsed; /* 位圖實際使用的顏色表的顏色數 */
unsigned int ciClrImportant; /* 重要顏色索引的個數 */
}__attribute__((packed)) BITMAPINFOHEADER; /* 位圖信息頭結構 */
BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;
unsigned char bmp_head[54];
static int fb_fp = -1;
static char *fb_addr = NULL;
int width=0;
int height=0;
static inline int fb_init(void)
{
int dev_fp = -1;
int fb_size;
struct fb_var_screeninfo vinfo;
dev_fp = open("/dev/fb0", O_RDWR);
if (dev_fp < 0) {
perror("/dev/fb0");
return -1;
}
if (ioctl(dev_fp, FBIOGET_VSCREENINFO, &vinfo)) {
printf("Error reading variable information.\n");
exit(1);
}
width=vinfo.xres;
height=vinfo.yres;
fb_bpp=vinfo.bits_per_pixel;
//if(fb_bpp==24) fb_bpp=32;
fb_size=width*height*fb_bpp/8;
if ((fb_addr = (char*)mmap(0, fb_size,
PROT_READ | PROT_WRITE, MAP_SHARED, dev_fp, 0)) < 0) {
perror("mmap()");
return -1;
}
printf("%dx%d bpp:%d mmaped 0x%08x\n",width,height,fb_bpp,fb_addr);
return dev_fp;
}
void writeImageToFile(unsigned int size)
{
sprintf(filename,"/mnt/sd/0%d.bmp",capframe);
bmpFile=fopen(filename, "w+");
if(fb_bpp == 16)
fwrite(bmp_head_t,1,66,bmpFile);
else
{
fwrite(&FileHead,1,14,bmpFile);
fwrite(&InfoHead,1,40,bmpFile);
}
//fwrite(fb_addr,1,size,bmpFile);
int h = 0;
for (h = height-1; h > 0; h--)
{
fwrite(fb_addr + h * width*fb_bpp/8, 1, width*fb_bpp/8, bmpFile);
}
fclose(bmpFile);
printf("%s\n", filename);
}
int main(int argc, char *argv[])
{
unsigned int i = 10;
unsigned long size = 0;
fb_fp = fb_init();
size=width*height*fb_bpp/8;
if (argc < 2)
{
printf("run like 'prntscr num', num is bmpname'\n");
return 0;
}
capframe = atoi(argv[1]);
if(fb_bpp==16){
*((unsigned int*)(bmp_head_t+18)) = width;
*((unsigned int*)(bmp_head_t+22)) = height;
*((unsigned short*)(bmp_head+28)) = 16;
}else{
FileHead.cfType[0] = 'B';
FileHead.cfType[1] = 'M';
unsigned int tmp = width*height*fb_bpp/8;+54;
FileHead.cfSize = tmp;
FileHead.cfoffBits = 54;
InfoHead.ciSize = 40;
InfoHead.ciWidth = width;
InfoHead.ciHeight = height;
InfoHead.ciBitCount = 32;
InfoHead.ciCompress = 0;
InfoHead.ciSizeImage = size;
}
//while(i--)
{
writeImageToFile(size);
}
return 0;
}
總結
以上是生活随笔為你收集整理的嵌入式linux截屏代码,嵌入式linux截屏程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb装入系统启动项
- 下一篇: 网易云音乐android变臃肿,网易云音