建设童装网站的意义,网页设计报告论文,网站备案填写,国内品牌营销成功案例Linux截图工具gsnap移植arm平台过程记录 最近工作中一款新产品开发接近尾声#xff0c;需要写文档截图产品图形#xff0c;找了一款开源的Linux截屏工具gsnap#xff0c;将其移植到ARM产品中#xff0c;这里记录一下移植过程。 gsnap
这个工具源代码就是一个C语言源文件需要写文档截图产品图形找了一款开源的Linux截屏工具gsnap将其移植到ARM产品中这里记录一下移植过程。 gsnap
这个工具源代码就是一个C语言源文件gsnap.c感谢作者的分享。
/** File: gsnap.c* Author: Li XianJing xianjimlihotmail.com* Brief: snap the linux mobile device screen.** Copyright (c) 2009 Li XianJing xianjimlihotmail.com** Licensed under the Academic Free License version 2.1** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*//** History:* * 2009-08-20 Li XianJing xianjimlihotmail.com created* 2011-02-28 Li XianJing xianjimlihotmail.com suppport RGB888 framebuffer.* 2011-04-09 Li XianJing xianjimlihotmail.com merge figofutures png output.* ref: http://blog.chinaunix.net/space.php?uid15059847doblogcuid2040565**/#include png.h
#include fcntl.h
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
#include jpeglib.h
#include sys/mman.h
#include sys/stat.h
#include sys/types.h
#include linux/fb.h
#include linux/kd.hstruct _FBInfo;
typedef struct _FBInfo FBInfo;
typedef int (*UnpackPixel)(FBInfo* fb, unsigned char* pixel, unsigned char* r, unsigned char* g, unsigned char* b);struct _FBInfo
{int fd;UnpackPixel unpack;unsigned char *bits;struct fb_fix_screeninfo fi;struct fb_var_screeninfo vi;
};#define fb_width(fb) ((fb)-vi.xres)
#define fb_height(fb) ((fb)-vi.yres)
#define fb_bpp(fb) ((fb)-vi.bits_per_pixel3)
#define fb_size(fb) ((fb)-vi.xres * (fb)-vi.yres * fb_bpp(fb))static int fb_unpack_rgb565(FBInfo* fb, unsigned char* pixel, unsigned char* r, unsigned char* g, unsigned char* b)
{unsigned short color *(unsigned short*)pixel;*r ((color 11) 0xff) 3;*g ((color 5) 0xff) 2;*b (color 0xff ) 3;return 0;
}static int fb_unpack_rgb24(FBInfo* fb, unsigned char* pixel, unsigned char* r, unsigned char* g, unsigned char* b)
{*r pixel[fb-vi.red.offset3];*g pixel[fb-vi.green.offset3];*b pixel[fb-vi.blue.offset3];return 0;
}static int fb_unpack_argb32(FBInfo* fb, unsigned char* pixel, unsigned char* r, unsigned char* g, unsigned char* b)
{*r pixel[fb-vi.red.offset3];*g pixel[fb-vi.green.offset3];*b pixel[fb-vi.blue.offset3];return 0;
}static int fb_unpack_none(FBInfo* fb, unsigned char* pixel, unsigned char* r, unsigned char* g, unsigned char* b)
{*r *g *b 0;return 0;
}static void set_pixel_unpacker(FBInfo* fb)
{if(fb_bpp(fb) 2){fb-unpack fb_unpack_rgb565;}else if(fb_bpp(fb) 3){fb-unpack fb_unpack_rgb24;}else if(fb_bpp(fb) 4){fb-unpack fb_unpack_argb32;}else{fb-unpack fb_unpack_none;printf(%s: not supported format.\n, __func__);}return;
}static int fb_open(FBInfo* fb, const char* fbfilename)
{fb-fd open(fbfilename, O_RDWR);if (fb-fd 0){fprintf(stderr, cant open %s\n, fbfilename);return -1;}if (ioctl(fb-fd, FBIOGET_FSCREENINFO, fb-fi) 0)goto fail;if (ioctl(fb-fd, FBIOGET_VSCREENINFO, fb-vi) 0)goto fail;fb-bits mmap(0, fb_size(fb), PROT_READ | PROT_WRITE, MAP_SHARED, fb-fd, 0);if (fb-bits MAP_FAILED)goto fail;printf(---------------framebuffer---------------\n);printf(%s: \n width : %8d\n height: %8d\n bpp : %8d\n r(%2d, %2d)\n g(%2d, %2d)\n b(%2d, %2d)\n,fbfilename, fb_width(fb), fb_height(fb), fb_bpp(fb), fb-vi.red.offset, fb-vi.red.length,fb-vi.green.offset, fb-vi.green.length,fb-vi.blue.offset, fb-vi.blue.length);printf(-----------------------------------------\n);set_pixel_unpacker(fb);return 0;fail:printf(%s is not a framebuffer.\n, fbfilename);close(fb-fd);return -1;
}static void fb_close(FBInfo* fb)
{munmap(fb-bits, fb_size(fb));close(fb-fd);return;
}static int snap2jpg(const char * filename, int quality, FBInfo* fb)
{int row_stride 0; FILE * outfile NULL;JSAMPROW row_pointer[1] {0};struct jpeg_error_mgr jerr;struct jpeg_compress_struct cinfo;memset(jerr, 0x00, sizeof(jerr));memset(cinfo, 0x00, sizeof(cinfo));cinfo.err jpeg_std_error(jerr);jpeg_create_compress(cinfo);if ((outfile fopen(filename, wb)) NULL) {fprintf(stderr, cant open %s\n, filename);return -1;}jpeg_stdio_dest(cinfo, outfile);cinfo.image_width fb_width(fb);cinfo.image_height fb_height(fb);cinfo.input_components 3;cinfo.in_color_space JCS_RGB;jpeg_set_defaults(cinfo);jpeg_set_quality(cinfo, quality, TRUE);jpeg_start_compress(cinfo, TRUE);row_stride fb_width(fb) * 2;JSAMPLE* image_buffer malloc(3 * fb_width(fb));while (cinfo.next_scanline cinfo.image_height) {int i 0;int offset 0;unsigned char* line fb-bits cinfo.next_scanline * fb_width(fb) * fb_bpp(fb);for(i 0; i fb_width(fb); i, offset 3, line fb_bpp(fb)){fb-unpack(fb, line, image_bufferoffset, image_buffer offset 1, image_buffer offset 2);}row_pointer[0] image_buffer;(void) jpeg_write_scanlines(cinfo, row_pointer, 1);}jpeg_finish_compress(cinfo);fclose(outfile);jpeg_destroy_compress(cinfo);return 0;
}//Ref: http://blog.chinaunix.net/space.php?uid15059847doblogcuid2040565
static int snap2png(const char * filename, int quality, FBInfo* fb)
{FILE *outfile;if ((outfile fopen(filename, wb)) NULL){fprintf(stderr, cant open %s\n, filename);return -1;}/* prepare the standard PNG structures */png_structp png_ptr png_create_write_struct(PNG_LIBPNG_VER_STRING,0,0,0);png_infop info_ptr png_create_info_struct(png_ptr);/* setjmp() must be called in every function that calls a PNG-reading libpng function */if (setjmp(png_jmpbuf(png_ptr))){png_destroy_write_struct(png_ptr, info_ptr);fclose(outfile);return -1;}/* initialize the png structure */png_init_io(png_ptr, outfile);//int width 0;int height 0;int bit_depth 8;int color_type PNG_COLOR_TYPE_RGB;int interlace 0;width fb_width(fb);height fb_height(fb);png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, color_type,(!interlace) ? PNG_INTERLACE_NONE : PNG_INTERLACE_ADAM7,PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);/* write the file header information */png_write_info(png_ptr, info_ptr);png_bytep row_pointers[height];png_byte* image_buffer malloc(3 * width);int i 0;int j 0;unsigned char* line NULL;for( ; i height; i ){line (char*)fb-bits i * width * fb_bpp(fb);for(j 0; j width; j, line fb_bpp(fb)){int offset j * 3;fb-unpack(fb, line, image_bufferoffset, image_bufferoffset1, image_bufferoffset2);}row_pointers[i] image_buffer;png_write_rows(png_ptr, row_pointers[i], 1);}png_destroy_write_struct(png_ptr, info_ptr);fclose(outfile);return 0;}int main(int argc, char* argv[])
{FBInfo fb;const char* filename NULL;const char* fbfilename NULL;if(argc ! 3){printf(\nUsage: %s [jpeg|png file] [framebuffer dev]\n, argv[0]);printf(Example: %s fb.jpg /dev/fb0\n, argv[0]);printf(-----------------------------------------\n);printf(Powered by broncho(www.broncho.cn)\n\n);return 0;}filename argv[1];fbfilename argv[2];memset(fb, 0x00, sizeof(fb));if (fb_open(fb, fbfilename) 0){if(strstr(filename, .png) ! NULL){snap2png(filename, 100, fb);}else{snap2jpg(filename, 100, fb);}fb_close(fb);}return 0;
}gsnap需要两个依赖库libjpeg和libPng。而libPng还要依赖Zlib库。关于Zlib库的交叉编译请参考我这篇文档不再赘述zlib库的交叉编译记录
编译libjpeg库
从官网ijg.org下载源码 在Linux主机中解压后进入解压目录jpeg-9f。 运行autotools的配置命令进行配置后编译。
./configure --hostarm-linux-gnueabihf --prefix/root/jpeg-9f/arm_install
make make install–host参数是指定编译器我已经将我的ARM交叉编译工具链目录设置在了系统目录中所以这里只需指定编译器前缀就行。 –prefix参数是指定编译后的安装目录编译后make工具会将生成的编译文件和头文件目录拷贝到这个指定目录中。
编译libpng库
从SourceForge中下载源代码我下载的是libpng-1.6.43.tar.gz 在Linux主机中解压后进入解压目录libpng-1.6.43。 注意因为需要zlib库故先配置一下几个编译变量。
export LDFLAGS-L/root/zlib/arm_install/lib
export CFLAGS-I/root/zlib/arm_install/include
export CPPFLAGS-I/root/zlib/arm_install/includeLDFLAGS是编译器搜索库文件路径变量。 CFLAGS是编译器C语言编译选项变量这里是设置zlib库的头文件位置。 CPPFLAGS是编译器预处理器选项变量这里是设置zlib库的头文件位置。 设置环境变量完毕后运行配置命令进行配置后编译。
./configure --hostarm-linux-gnueabihf --prefix/root/libpng-1.6.43/arm_install
make make install编译gsnap
几个库都准备好了进入gsnap目录将gsnap.c文件拷贝进来进行编译。编译命令如下
arm-linux-gnueabihf-gcc -o gsnap gsnap.c \
-L/root/jpeg-9f/arm_install/lib \
-L/root/libpng-1.6.43/arm_install/lib \
-L/root/zlib/arm_install/lib \
-I/root/jpeg-9f/arm_install/include \
-I/root/libpng-1.6.43/arm_install/include \
-I/root/zlib/arm_install/include \
-static -ljpeg -lpng -lz -lm此命令是用静态链接方式编译后不再需要几个库文件单独使用编译后的gsnap文件即可。 将编译目标文件gsnap拷贝到arm板子中。 运行命令:
gsnap test.jpg /dev/fb0这样就捕获了当前屏幕的截图文件test.jpg。
如果文章对您有用请随手点个赞谢谢^_^