嵌入式linux通用截图工具

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

为了截几张图片给broncho的A1做宣传,昨天写了一个截图工具。这个工具与其它截图工具不同的是,它不基于任何具体的GUI,直接从framebuffer中截图,然后保存为jpeg图片,所以适用于任何嵌入式linux设备。

o 打开framebuffer

static int fb_open(struct FB *fb, const char* fbfilename)
{
    fb->fd = open(fbfilename, O_RDWR);
    if (fb->fd < 0)
    {
        fprintf(stderr, "can't 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;
 
    return 0;
fail:
    printf("%s is not a framebuffer./n", fbfilename);
    close(fb->fd);
 
    return -1;
}

o 读取数据并写入jpeg

static int snap(const char * filename, int quality, struct FB* fb)
{
    int row_stride = 0;
    FILE * outfile = NULL;
    JSAMPROW row_pointer[1] = {0};
    struct jpeg_error_mgr jerr = {0};
    struct jpeg_compress_struct cinfo = {0};
 
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
 
    if ((outfile = fopen(filename, "wb+")) == NULL)
    {
        fprintf(stderr, "can't 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;
        unsigned short* line = fb->bits + cinfo.next_scanline * fb_width(fb);
        for(i = 0; i < fb_width(fb); i++)
        {
            int offset = i * 3;
            unsigned short color = line[i];
            unsigned char r = ((color >> 11) & 0xff) << 3;
            unsigned char g = ((color >> 5) & 0xff)  << 2;
            unsigned char b = (color & 0xff )<< 3;
            image_buffer[offset]     = r;
            image_buffer[offset + 1] = g;
            image_buffer[offset + 2] = b;
        }
 
        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;
}

o 主函数

int main(int argc, char* argv[])
{
    struct FB fb = {0};
    const char* filename   = NULL;
    const char* fbfilename = NULL;
 
    if(argc != 3)
    {   
        printf("/nusage: %s [jpeg] [framebuffer]/n", argv[0]);
        printf("-----------------------------------------/n");
        printf("Powered by broncho(www.broncho.cn)/n");
        return 0;
    }
 
    filename   = argv[1];
    fbfilename = argv[2];
    if (fb_open(&fb, fbfilename) == 0)
    {
        snap(filename, 100, &fb);
        fb_close(&fb);
    }
 
    return 0;
}

完整代码请到这里 下载。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 《韦东山嵌入式Linux书》是一本针对嵌入式Linux系统的专业著作,内容系统全面且实用性强。 首先,这本书介绍了嵌入式Linux系统的基础知识,包括Linux操作系统的发展历程、嵌入式系统的特点和应用场景等。通过对这些基础知识的讲解,读者可以全面了解嵌入式Linux系统的概念和背景。 其次,书中提供了详细的嵌入式Linux系统开发流程和步骤。从系统环境搭建、内核编译与配置、设备驱动开发、文件系统的构建等方面进行了全面的讲解。读者可以通过逐步跟随实例代码的编写和调试过程,实际掌握嵌入式Linux系统的开发技术。 此外,书中还介绍了嵌入式Linux系统的调试与优化技巧,包括性能分析、内存管理、电源管理等方面的内容,有助于读者进一步完善和提高嵌入式Linux系统的性能和可靠性。 总的来说,《韦东山嵌入式Linux书》是一本系统、全面且实用的专业书籍。无论是初学者还是有一定经验的开发人员,都可以从中获得关于嵌入式Linux系统的深入理解和实践能力。通过阅读这本书,读者可以掌握从零开始构建嵌入式Linux系统的技术,为今后的嵌入式开发工作奠定坚实的基础。 ### 回答2: 《韦东山嵌入式Linux书》是一本深入浅出的嵌入式Linux学习指南。本书围绕嵌入式Linux的核心概念和技术,以通俗易懂的语言介绍了嵌入式Linux系统的构建和运行。 首先,本书从嵌入式系统和Linux操作系统的基础知识入手,讲解了Linux内核的架构和工作原理。读者可以学会如何理解Linux系统的运行机制以及如何进行系统配置和编译。 其次,本书详细介绍了嵌入式Linux的应用开发。作者以实际项目为例,教授了如何利用Linux的各种工具和技术进行嵌入式软件开发。包括交叉编译环境的搭建、驱动程序的开发、文件系统的构建和调试等等。 此外,本书还介绍了嵌入式Linux的系统调试和性能优化方法。读者可以学习到如何通过调试器和性能分析工具来定位和解决系统中的问题。同时,本书还提供了一些常用的优化技巧,帮助读者提高系统的性能和响应速度。 总体而言,《韦东山嵌入式Linux书》是一本很好的嵌入式Linux入门教材。无论是对于初学者还是有一定经验的开发人员,都能通过本书学习嵌入式Linux的基础知识和技术,为在实际项目中应用嵌入式Linux打下坚实的基础。 ### 回答3: 《韦东山嵌入式Linux书》是一本关于嵌入式Linux操作系统的书籍,作者韦东山是一位经验丰富的嵌入式系统工程师。这本书主要介绍了嵌入式Linux系统的基本原理、应用开发和调试技术,对于想要学习和深入了解嵌入式Linux开发的读者来说是一本很好的参考书。 该书首先介绍了嵌入式Linux系统的概念和特点,包括其与通用操作系统的区别。接着详细说明了Linux内核和文件系统的搭建和配置方法,以及如何通过交叉编译将其部署到嵌入式设备中。读者可以通过学习这些内容,了解嵌入式Linux系统的基本概念和架构,有助于进一步学习和开发。 除此之外,该书还介绍了嵌入式Linux系统的应用开发技术,包括驱动程序开发、设备文件操作、进程管理、网络编程等。这些知识点覆盖了嵌入式Linux系统开发的核心内容,读者可以通过学习和实践,掌握在嵌入式平台上开发应用程序的方法和技巧。 此外,该书还特别强调了嵌入式Linux系统的调试和性能优化技术。通过学习这些内容,读者可以了解和掌握在开发过程中常见的问题和解决方法,提高代码的效率和稳定性。 总的来说,韦东山的《嵌入式Linux书》是一本很好的学习嵌入式Linux开发的参考书,全面介绍了嵌入式Linux系统的原理、应用开发和调试技术,对于想要从事嵌入式开发的读者来说是一本很有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值