3

我正在使用 GCC 4.7.2、C89 和 ImageMagick-6.8.0-4。

我正在尝试使用 ImageMagick API 截屏。我已经下载、编译并安装了头文件和库。

但是,我在文档中看不到执行屏幕截图的 API 调用。我将链接并包含标题,以便我可以从我的 C 程序调用 API。我只想要我必须用来执行此操作的函数的名称。

谁能指出我正确的方向?ImageMagick 可以截图吗?

4

3 回答 3

21

使用“x:”特殊文件格式

如果你想要一个不刺激的屏幕抓取;您可以通过将“ x:root ”作为源参数传入来调用 ImageMagick 的导入命令MagickReadImagex: 格式通过传递pid或窗口标签允许完整的屏幕截图或单个窗口。额外的修饰符可以捕获区域和分页。

#include <wand/MagickWand.h>

int main(int argc, char **argv) 
{
    MagickWandGenesis();
    MagickWand *wand = NULL;
    wand = NewMagickWand();
    MagickReadImage(wand,"x:root"); // <-- Invoke ImportImageCommand
    MagickWriteImage(wand,"screen_shot.png");
    if(wand)wand = DestroyMagickWand(wand);
    MagickWandTerminus();
    return 0;
}

使用额外的“魔术”库

wand在库之外,magick/xwindow.h允许您使用XImportImage, XImportInfo&XGetImportInfo方法导入图像。您可以在 ImageMagick 的源文件wand/import.c中检查这些方法是如何工作的。

直接使用 X 和像素迭代器

MagickWand 还包括 PixelWand;其中,可以遍历内存中的图像指针。更多的工作,但更大的灵活性。

#include <stdio.h>
#include <wand/MagickWand.h>
#include <X11/Xlib.h>

int main(int argc, char **argv) {
    int x,y;
    unsigned long pixel;
    char hex[128];

    // X11 items
    Display *display = XOpenDisplay(NULL);
    Window root = DefaultRootWindow(display);
    XWindowAttributes attr;
    XGetWindowAttributes(display, root, &attr);

    // MagickWand items
    MagickWand *wand = NULL;
    PixelWand *pwand = NULL;
    PixelIterator *pitr = NULL;
    PixelWand **wand_pixels = NULL;

    // Set-up Wand
    MagickWandGenesis();
    pwand = NewPixelWand();
    PixelSetColor(pwand,"white"); // Set default;
    wand = NewMagickWand();
    MagickNewImage(wand,attr.width,attr.height,pwand);
    pitr = NewPixelIterator(wand);

    // Get image from display server
    XImage *image = XGetImage(display,root, 0,0 , 
                                attr.width, attr.height,
                                XAllPlanes(), ZPixmap);

    unsigned long nwands; // May also be size_t

    for (y=0; y < image->height; y++) {
        wand_pixels=PixelGetNextIteratorRow(pitr,&nwands);
            for ( x=0; x < image->width; x++) {
                pixel = XGetPixel(image,x,y);
                sprintf(hex, "#%02x%02x%02x",
                                pixel>>16,           // Red
                                (pixel&0x00ff00)>>8, // Green
                                pixel&0x0000ff       // Blue
                                );
                PixelSetColor(wand_pixels[x],hex);
            }
            (void) PixelSyncIterator(pitr);
    }

    // Write to disk
    MagickWriteImages(wand,"screen_test.png");

    // Clean-Up
    XDestroyImage(image);
    pitr=DestroyPixelIterator(pitr);
    wand=DestroyMagickWand(wand);
    MagickWandTerminus();
    XCloseDisplay(display);
    return 0;
}

有帮助的提示

确保 ImageMagick 能够连接到您的显示系统。尝试一些importCLI 命令来验证您的本地安装是否正常工作。这个问题就是一个很好的例子。

import -display localhost:0.0 -window root test_out.png
import -display ::0 -window root test_out.png
import -display :0.0 -window root test_out.png
import -display :0 -window root test_out.png
于 2012-11-06T14:42:25.443 回答
2

imagemagick 的cli 程序import可以像这样运行来截取屏幕截图:

import -window root screenshot.png

所以输入图像可以指定为文件或-window root

于 2012-11-04T15:15:16.763 回答
1
  1. 类型:import fileName.fileType(例如:import screen.png)
  2. 将出现一个十字光标:单击并将其拖动到您要捕获的屏幕部分(确保终端窗口没有覆盖您要捕获的内容)
于 2012-11-13T10:14:28.147 回答