Linux C 实现屏幕截图

2021-11-30  本文已影响0人  孙庚辛

首先安装 libimlib2-dev 软件包,

# sudo apt install libimlib2-dev

然后安装 giblib

# wget http://pkgs.[Fedora](http://www.linuxidc.com/topicnews.aspx?tid=5 "Fedora")project.org/repo/pkgs/giblib/giblib-1.2.4.tar.gz/c810ef5389baf24882a1caca2954385e/giblib-1.2.4.tar.gz 
# tar zxvf  giblib-1.2.4.tar.gz
# cd giblib-1.2.4
# ./configure
# make
# sudo make install

最后编写源码文件 Makefile、screen.c 和 screen.h ,并执行 make 命令编译。
Makefile:

CC = gcc
CFLAGS = -Wall -Werror -Wcast-align -g
LDFLAGS =
SCREENOBJECT = screen.o
GIBLIBCFLAGS = `giblib-config --cflags`
GIBLIBLIBS = `giblib-config --libs`

all: screen
screen: $(SCREENOBJECT)
    $(CC) $(LDFLAGS) $(GIBLIBLIBS) $(SCREENOBJECT) -lX11 -o $@

screen.o: screen.c screen.h
    $(CC) $(CFLAGS) $(GIBLIBCFLAGS) -c $<

clean:
    rm -f screen *~ *.o a.out
clean-media:
    rm -f *~ *.jpeg
.PHONY: all clean

screen.c:

#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);
}

screen.h:

#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

上一篇 下一篇

猜你喜欢

热点阅读