Снимок экрана субрегиона с использованием GTK - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь сделать скриншоты только части экрана, используя Python под Ubuntu 10.04.

Вот мой код (предположим, IMAGE_GRAB является ложным):

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 4: 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

1 Ответ

4 голосов
/ 15 декабря 2011

Я думаю, это потому, что get_pixels возвращает вам данные, которые хранятся в памяти.Что вам здесь не хватает, так это тому, что в конце строки строка может иметь некоторые отступы по соображениям производительности (из-за ограничений выравнивания памяти).

См. Структуру GdkPixbuf : интересныйинформация - это строка строки, которая представляет собой число байтов между началом строки и началом следующей строки.Он равен количеству байтов данных + байтов заполнения в строке.

Остерегайтесь того, что в последней строке нет заполнения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...