我正在使用 GCC 4.7.2、C89 和 ImageMagick-6.8.0-4。
我正在尝试使用 ImageMagick API 截屏。我已经下载、编译并安装了头文件和库。
但是,我在文档中看不到执行屏幕截图的 API 调用。我将链接并包含标题,以便我可以从我的 C 程序调用 API。我只想要我必须用来执行此操作的函数的名称。
谁能指出我正确的方向?ImageMagick 可以截图吗?
我正在使用 GCC 4.7.2、C89 和 ImageMagick-6.8.0-4。
我正在尝试使用 ImageMagick API 截屏。我已经下载、编译并安装了头文件和库。
但是,我在文档中看不到执行屏幕截图的 API 调用。我将链接并包含标题,以便我可以从我的 C 程序调用 API。我只想要我必须用来执行此操作的函数的名称。
谁能指出我正确的方向?ImageMagick 可以截图吗?
如果你想要一个不刺激的屏幕抓取;您可以通过将“ x:root ”作为源参数传入来调用 ImageMagick 的导入命令MagickReadImage
。x: 格式通过传递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中检查这些方法是如何工作的。
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 能够连接到您的显示系统。尝试一些import
CLI 命令来验证您的本地安装是否正常工作。这个问题就是一个很好的例子。
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
imagemagick 的cli 程序import
可以像这样运行来截取屏幕截图:
import -window root screenshot.png
所以输入图像可以指定为文件或-window root