2011-12-15 21 views
2

私は、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:enter image description here 2:enter image description here 3:enter image description here

この

はメインラインであります: enter image description here

ここで、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 
+0

非常にpythonicではありませんが、あなたは['shutter'](http://shutter-project.org/)を使いたいかもしれません:' shutter -s = X、Y、WIDTH、HEIGHT -e' – jcollado

答えて

4

私はそれがメモリに保存されているようget_pixelsはあなたにデータを返すため、それはだと思います。ここで欠けているのは、パフォーマンス上の理由から(メモリの配置制約のために)行の最後にパディングがあることです。

GdkPixbuf structureを参照してください。興味深い情報は、行の開始から次の行の開始までのバイト数であるrowstrideです。行内のデータバイト数+パディングバイト数と同じです。

注意してください。最終行にはパディングなしがあります。

+1

あなたは私を入れます適切なトラックに。バッファーはウィンドウのフルサイズでしたが、必要なサブリージョンと同じサイズであるかのように処理していました。私は小区域の外に何も必要ないので、バッファのサイズを小区域のサイズに縮小することで問題を解決しました。 – misha

関連する問題