这个问题与此类似
但是对于linux/X11.
更具体地说,我需要一种方法来捕获在X11显示器上运行的一个窗口(在windows中的alt-print屏幕的程序化等效物)的像素图像.
注意事项和要求:
1)即使在正在捕获的窗口顶部放置一个新窗口,像素图像仍应指向原始应用程序窗口而没有任何遮挡
2)不需要用户看到应用程序窗口,我只需要存储像素缓冲区/图像用于视频目的
我探索的其他替代方案是:
1)xvfb - 它可以工作,但它确实可以进行CPU渲染,这很慢并且浪费了很好的GPU
2)x11里面很多lxc - 理论上可以工作,但设置很复杂,我不确定它会很好地扩展,许多窗口被捕获
欢迎提出建议和想法
出于支持原因,我希望用户能够尽可能简单地截取当前浏览器窗口的屏幕截图并将其发送到服务器.
任何(疯狂的)想法?
如果我的webdriver测试失败(任何异常或断言错误),我想自动捕获屏幕截图.我正在使用Python unittest和Selenium Webdriver.有没有人有这个问题的解决方案?
是否有可能从创建的UIView获取UIImage snapshotViewAfterScreenUpdates?
snapshotViewAfterScreenUpdates当作为子视图添加时,UIView返回看起来很好,但是下面会产生一个黑色图像:
UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES];
UIImage *snapshotImage = [self imageFromView:snapshotView];
- (UIImage *)imageFromView:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
// [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- same result...
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
Run Code Online (Sandbox Code Playgroud)
当然可以在不依赖的情况下获取图像snapshotViewAfterScreenUpdates:
UIImage *snapshotImage = [self imageFromView:someView];
Run Code Online (Sandbox Code Playgroud)
不幸的是,在捕捉复杂视图时,drawViewHierarchyInRect速度无法与之匹敌snapshotViewAfterScreenUpdates.我希望UIImage从创建的视图中获取它会更快snapshotViewAfterScreenUpdates,这可能吗?
-renderInContext:自从它出现以来已被广泛使用,但由于不可能渲染OpenGL层,AVPreviewLayer(可能因为是一种OpenGL层)而且我仍然无法正确渲染CATiledLayer.
随着iOS7引入了2个新的API来获取屏幕截图,一个是-snapshotViewAfterScreenUpdates:返回一个特定的视图(_UIReplicantView)而-drawViewHierarchyInRect:afterScreenUpdates:最后一个是一种替代-renderInContext,不幸的是它似乎有相同的限制.
-snapshotViewAfterScreenUpdates:它似乎也适用于OpenGL和AVPreviewLayer,不幸的是,如果你想做特定的动画或使用内容作为某些东西(如uibutton)的背景,这样的视图不是很有用.我试图从返回的视图中删除内容,但我仍然没有运气.
有人试过吗?
我目前试图用图像制作电影,但我找不到任何有用的东西.
到目前为止,这是我的代码:
import time
from PIL import ImageGrab
x =0
while True:
try:
x+= 1
ImageGrab().grab().save('img{}.png'.format(str(x))
except:
movie = #Idontknow
for _ in range(x):
movie.save("img{}.png".format(str(_)))
movie.save()
Run Code Online (Sandbox Code Playgroud) 我正在尝试捕获屏幕图像以用于截屏.因此我需要一个快速的解决方案,并且不能依赖shell程序,如import或xwd.
这是我到目前为止编写的代码,但是它失败并且给了我一个垃圾图像,它似乎只是显示了奇怪颜色的几个图像的片段.
http://s9.postimage.org/dqnkgkwr1/blah.png
关于我做错了什么的任何想法?
#include <X11/Xlib.h>
#include <X11/X.h>
#include <cstdio>
#include <CImg.h>
using namespace cimg_library;
int main()
{
Display *display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
XWindowAttributes gwa;
XGetWindowAttributes(display, root, &gwa);
int width = gwa.width;
int height = gwa.height;
XImage *image = XGetImage(display,root, 0,0 , width,height,AllPlanes, ZPixmap);
unsigned char *array = new unsigned char[width * height * 3];
unsigned long red_mask = image->red_mask;
unsigned long green_mask = image->green_mask;
unsigned long blue_mask = image->blue_mask;
for (int x = 0; x < …Run Code Online (Sandbox Code Playgroud) 由于我使用Emacs Org模式作为研究日志,有时我想通过截图图像跟踪某些内容,我绝对不想保存它们.所以我想知道有没有办法将这些数字插入到我的组织模式文件中,就像从剪贴板中处理它们一样?
如何通过代码(在Swift中)从我的屏幕截取屏幕截图并保存?我可以截取屏幕并将其保存为图像吗?
我看了,我看到了这段代码,但我不能使用它(我认为),因为它没有做任何事情.
var screen = UIScreen.mainScreen()
snapshotVieww = screen.snapshotViewAfterScreenUpdates(false)
UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0)
snapshotVieww.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
provino = UIImageView(image: image)
Run Code Online (Sandbox Code Playgroud)