Welcome 微信登录

首页 / 操作系统 / Linux / 使用imlib2函数库实现截屏功能

本文演示使用imlib2函数库实现截屏功能
程序运行后,截屏图像保存为jpeg格式文件到当前目录下,起名为“screen.jpeg”在Debian 5.02系统下,安装libimlib2-dev软件包
imlib2的API文档在 /usr/share/doc/libimlib2-dev/html/index.html 用cvs获取笔者本机screen项目的源代码如下:
$ cvs co -p screen
cvs checkout: Updating screen
===================================================================
Checking out screen/Makefile
RCS:  /home/c-aries/cvs/screen/Makefile,v
VERS: 1.2
***************
CC = gcc
CFLAGS = -Wall -Werror -Wcast-align -g
LDFLAGS =SCREENOBJECT = screen.oGIBLIBCFLAGS = `giblib-config --cflags`
GIBLIBLIBS = `giblib-config --libs`all: screenscreen: $(SCREENOBJECT)
    $(CC) $(LDFLAGS) $(GIBLIBLIBS) $(SCREENOBJECT) -o $@screen.o: screen.c screen.h
    $(CC) $(CFLAGS) $(GIBLIBCFLAGS) -c $<clean:
    rm -f screen *~ *.o a.outclean-media:
    rm -f *~ *.jpeg.PHONY: all clean
===================================================================
Checking out screen/screen.c
RCS:  /home/c-aries/cvs/screen/screen.c,v
VERS: 1.2
***************
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <giblib/giblib.h>
#include "screen.h"void
screen_init(struct screen *screen)
{
  screen->display = XOpenDisplay(NULL);
  if (!screen->display) {
    perror("XOpenDisplay");
    exit(EXIT_FAILURE);
  }
  screen->screen = ScreenOfDisplay(screen->display,
                  DefaultScreen(screen->display));
  screen->visual = DefaultVisual(screen->display,
                DefaultScreen(screen->display));
  screen->colormap = DefaultColormap(screen->display,
                DefaultScreen(screen->display));
  screen->root = RootWindow(screen->display,
                DefaultScreen(screen->display));
  imlib_context_set_display(screen->display);
  imlib_context_set_visual(screen->visual);
  imlib_context_set_colormap(screen->colormap);
}int
main(int argc, char *argv[])
{
  struct screen screen;
  Imlib_Image image;  screen_init(&screen);
  image = gib_imlib_create_image_from_drawable(screen.root,
                           0,
                           0,
                           0,
                           screen.screen->width,
                           screen.screen->height,
                           1);
  imlib_context_set_image(image);
  imlib_image_set_format("jpeg");
  imlib_save_image("screen.jpeg");
  imlib_free_image();
  exit(EXIT_SUCCESS);
}
===================================================================
Checking out screen/screen.h
RCS:  /home/c-aries/cvs/screen/screen.h,v
VERS: 1.1.1.1
***************
#ifndef SCREEN_H
#define SCREEN_H#include <X11/Xlib.h>struct screen {
  Display *display;
  Screen *screen;
  Visual *visual;
  Colormap colormap;
  Window root;
};void screen_init(struct screen *screen);#endif
$
 该程序参考了scrot项目的源代码和imlib2的编程文档上周的文章 video4linux2编程实例 使用video4linux2编程接口获得摄像头数据流,再将YUYV数据流转换成RGB数据流。
然后想添加截取图片功能,将摄像头的RGB数据流保存成JPEG图片。
找来平时一直在使用的自由软件scrot,阅读其源代码,即找到将RGB保存成JPEG图片的方法:
“将用于SDL的像素格式RGBA转换成用于imlib2的像素格式ARGB,再用imlib2的imlib_create_image_using_data()函数保存成JPEG图片”
这部分的代码下周再介绍吧:)实现截取图片功能的期间,学会了截屏功能……
于是顺便把实现截屏的代码贴出来,作为编程实例。Fedora或RedHat Linux下设置静态IP双操作系统下Ubuntu 10.04 和Grub2的完美删除(with Win7)相关资讯      Debian 
  • Debian GNU/Linux系统迎来23岁生日  (08月18日)
  • Debian Live 项目的剧变  (05月04日)
  • 为什么说Debian是主流Linux操作系  (01月11日)
  • Debian停止支持一批旧的32位CPU  (05月09日)
  • Linux桌面发行版Debian安装起来到  (05月04日)
  • Debian 创始人 Ian Murdock 先生去  (12/31/2015 10:10:49)
本文评论 查看全部评论 (0)
表情: 姓名: 字数