私は、Ubuntu 10.04でPythonを使ってスクリーンの一部だけのスクリーンショットを撮ろうとしています。GTKを使った画面部分領域のスクリーンショット
はここに私のコードです(IMAGE_GRAB
がFalseであると仮定しない):ここに空想
def screenshot_roi(regions):
if IMAGE_GRAB:
return map(ImageGrab.grab, regions)
else:
w = gtk.gdk.get_default_root_window()
sz = w.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
src = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
results = []
for roi in regions:
if not roi:
results.append(None)
continue
x,y,width,height = roi
dst = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,width,height)
src.copy_area(x,y,width,height,dst,0,0)
im = PIL.Image.fromstring("RGB", (width, height), dst.get_pixels())
results.append(im)
return results
何を。ドロアブル全体をピクセルバッファにキャプチャし、各ピクセルバッファをトリミングして必要なPILオブジェクトに変換します。
def main():
regions = [(845, 219, 248, 82), (1101, 243, 109, 59),
(1213, 245, 66, 57), (1281, 245, 74, 58)]
images = screenshot_roi(regions)
for i,roi in enumerate(images):
if roi:
roi.save('%d.png' % i)
if __name__ == '__main__':
main()
(すべての最初のものを除く)、得られた画像は、ストライドの問題を持っている、しかし:
1: 2: 3:
この
はメインラインであります:ここで、PILでクロッピングを実行すると、すべて正常に動作します。
def screenshot_roi(regions):
if IMAGE_GRAB:
return map(ImageGrab.grab, regions)
else:
w = gtk.gdk.get_default_root_window()
sz = w.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1])
src = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1])
entire_im = PIL.Image.fromstring("RGB", sz, src.get_pixels())
results = []
for roi in regions:
if not roi:
results.append(None)
continue
x,y,width,height = roi
crop = entire_im.crop((x,y,x+width,y+height))
crop.load()
results.append(crop)
return results
GTKからPILへの変換がかなり高価であるため、私はこのようにしたくないと思っていました。それは私が全体のイメージを変換して小さなサブリージョンを取得するだけなので、無駄です。
誰もGTKバージョンにストライドエラーが発生している理由をお聞かせください。
EDIT
の作業ソース:
x,y,w,h = region
win = gtk.gdk.get_default_root_window()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,w,h)
src = pb.get_from_drawable(win,win.get_colormap(),x,y,0,0,w,h)
im = PIL.Image.frombuffer('RGB', (w,h), src.get_pixels(), 'raw',
'RGB', src.get_rowstride(), 1)
return im
非常にpythonicではありませんが、あなたは['shutter'](http://shutter-project.org/)を使いたいかもしれません:' shutter -s = X、Y、WIDTH、HEIGHT -e' – jcollado