abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:22 | Zajímavý projekt

    Max Leiter v roce 2019 zkusil zprovoznit X server na iPadu (iOS). Nyní se k tématu vrátil a s pomocí LLM a balíčkovacích nástrojů Procursus rozběhl desktop s X11 i Waylandem. Jeho balíčky jsou dostupné v repozitáři xiOS.

    |🇵🇸 | Komentářů: 1
    dnes 13:33 | IT novinky

    Společnost Google Cloud dnes oznámila, že její infrastruktura a služby byly oficiálně zařazeny do Katalogu cloud computingu vedeného Digitální a informační agenturou (DIA). Tato certifikace potvrzuje, že infrastruktura a služby Google Cloud splňují přísné bezpečnostní a regulační požadavky České republiky pro provoz cloudových služeb ve veřejném sektoru.

    Ladislav Hagara | Komentářů: 3
    dnes 13:11 | IT novinky

    Vůbec poprvé v historii se stát při testování digitálních služeb obrací na širokou veřejnost. Digitální a informační agentura (DIA) a Ministerstvo vnitra zvou občany k zapojení do zátěžového testu eDokladů, které od loňského podzimu prošly optimalizací aplikace a posílením infrastruktury. Test proběhne 13. srpna ve 13:00 a pro jeho úspěch bude potřeba zapojení několika desítek tisíc občanů. Zapojení do testu je zcela dobrovolné a úkol

    … více »
    Ladislav Hagara | Komentářů: 16
    dnes 13:00 | Nová verze

    FireDragon je webový prohlížeč, doposud založený na Floorpu, jednom z forků Firefoxu s větším důrazem na ochranu soukromí a přizpůsobení uživatelského rozhraní. Spravuje ho člen komunity distribuce Garuda Linux. Nové vydání verze 13 opouští Floorp a přechází přímo na Firefox s patchi z LibreWolfu a vlastními úpravami. Dostupný je také na Flathubu.

    |🇵🇸 | Komentářů: 0
    dnes 05:44 | Zajímavý software

    picogame (GitHub) je malý 2D herní engine pro mikrokontroléry jako RP2040, čip uvnitř kapesní konzole Picopad. Hru napíšeš v Pythonu a vyzkoušíš ji v prohlížeči nebo desktopovém simulátoru. Až bude hotová, zkopíruješ ji na podporovanou desku. Na začátku nepotřebuješ C, sestavení firmwaru ani hardware.

    Ladislav Hagara | Komentářů: 1
    včera 19:22 | Nová verze

    Multiplatformní prohlížeč elektronických knih KOReader byl vydán ve verzi 2026.07 "Sailing Walrus". U PDF souborů s SMask lze vyčistit pozadí. Přibyla podpora Kobo v5 nebo základní podpora OPDS 2.0.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | Komunita

    Společnost Valve sponzoruje a společnost Collabora portuje RADV (open source Vulkan ovladač pro AMD GPU z projektu Mesa) na Windows.

    Ladislav Hagara | Komentářů: 0
    28.7. 20:44 | Zajímavý projekt

    Starling (GitHub) je desktopové prostředí vytvořeno umělou inteligencí (s dohledem jednoho vývojáře během šesti měsíců).

    Ladislav Hagara | Komentářů: 37
    28.7. 14:22 | IT novinky

    Dne 30. června 2026 byla završena fyzická realizace projektu Czech National Quantum Communication Infrastructure (CZQCI), tedy České národní kvantové komunikační infrastruktury. Projekt byl realizován od 1. března 2023 a financován z Národního plánu obnovy částkou 121,6 milionu Kč. Cílem podpořeného projektu bylo vybudovat základy národní kvantové komunikační infrastruktury a ověřit možnosti jejího praktického využití. Mezi

    … více »
    Ladislav Hagara | Komentářů: 3
    28.7. 14:11 | IT novinky

    Město Šumperk se stalo terčem kybernetického útoku, chod úřadu je omezen. Zjišťuje se, jestli unikla nějaká data. Cílem hackerů byla městská datová síť. První útoky zaznamenali odborníci na informační technologie již v pondělí večer, závady se ale plně projevily až dnes ráno. Město událost nahlásilo Národnímu úřadu pro kybernetickou a informační bezpečnost (NUKIB).

    Ladislav Hagara | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (18%)
     (30%)
     (5%)
     (6%)
     (2%)
     (15%)
     (23%)
    Celkem 2285 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: Screenshot obrazovky C/C++

    25.2.2016 22:09 Marecek
    Screenshot obrazovky C/C++
    Přečteno: 1041×

    Ahoj, potreboval bych pomoct navect na smer, chtel bych pod linuxem delat screenshot obrazovky v C/C++ a presnaset to po siti na druhy stroj, presnos po LAN uz mam vyresen (klient-server) pres sockety v C, je to tedy dost pracne, ale funguje to. (pokud by nekdo dal tip i na nejake knihovny co usnadnuji praci se sockety nebudu se zlobit), ted mi vrta hlavou jak udelat ten screenshot, treba ho delat 5x za sekundu.

    Dekuji. Marecek

    Odpovědi

    25.2.2016 22:44 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++

    koukni na imlib2

    USE="-gnome -kde";turris
    27.2.2016 12:34 Marecek
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++

    Diky, docela zajimava knihovna.

    Jendа avatar 26.2.2016 11:23 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    Co na to spustit externí program (scrot, import, …) a nechat si data vypsat v nějakém hezkém formátu (PPM) na jeho stdout?
    26.2.2016 19:29 Jardík
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    xcb_connect, pak xcb_get_setup, tam najdeš screen a id 'root' okna, jeho velikost a jeho visual (což je něco jako jaká je barevná hloubka a formát dat. Pak přes SHM utvoříš blok paměti a pošleš xkám request na kopii okna to tý bitmapy. Až to udělá, pošle ti info, že je hotovo, a můžeš to poslat přes socket.
    27.2.2016 12:36 Marecek
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++

    Joo, to by mohlo byt ono, prostuduji to.

    Ja zacal studovat nejaky opensource grabber obrazovaky, ale je to prilis mnoho kodu nez izoluji to co hledam.

    Dekuji. M

    27.2.2016 20:45 Jardík
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    Není to dokonalé, možná tam chybí někde chybové kontroly, možná je tam někde memory leak, ale nechtělo se mi s tím dělat moc dlouho. V komentáři je označeno místo, kde zpracovat výsledná data.
    #include <assert.h>
    #include <errno.h>
    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <xcb/xcb.h>
    #include <xcb/shm.h>
    
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    #include <sys/ipc.h>
    #include <sys/shm.h>
    
    
    enum {
        SCR_ERR_OK,
        SCR_ERR_CONNECTION_FAIL,
        SCR_ERR_CONNECTION_ERR,
        SCR_ERR_INVALID_SCREEN,
        SCR_ERR_SHM_NOT_SUPPORTED,
        SCR_ERR_INVALID_VISUAL,
        SCR_ERR_INVALID_PIXMAP_FORMAT,
        SCR_ERR_UNSUPPORTED_VISUAL,
        SCR_ERR_IMAGE_EMPTY,
        SCR_ERR_IMAGE_TOO_LARGE,
        
        SCR_ERR_SHMGET_FAILED,
        SCR_ERR_SHM_ATTACH_FAILED,
        SCR_ERR_GET_IMAGE_FAILED,
        SCR_ERR_GET_IMAGE_RACE_CONDITION
    };
    
    struct screenshoter
    {
        xcb_connection_t *con;
        xcb_setup_t const *setup;
        xcb_screen_t *screen;
        int screen_num;
    
        xcb_depth_t const* depth;
        xcb_visualtype_t const* visual;
        xcb_format_t const* pixformat;
    
        xcb_query_extension_reply_t const* shm_ext;
    
        xcb_shm_seg_t shm_seg;
    
        struct {
            unsigned char *data;
            size_t stride, size;
        } image;
    };
    
    int receive_screenshot(struct screenshoter *scr)
    {
        xcb_shm_get_image_cookie_t img_ck = xcb_shm_get_image(scr->con, scr->screen->root,
                0, 0, scr->screen->width_in_pixels, scr->screen->height_in_pixels,
                UINT32_MAX, XCB_IMAGE_FORMAT_XY_PIXMAP, scr->shm_seg, 0);
        xcb_generic_error_t *err = NULL;
        xcb_shm_get_image_reply_t *img_rep = xcb_shm_get_image_reply(scr->con, img_ck, &err);
        if (!img_rep) {
            if (err) free(err);
            return SCR_ERR_GET_IMAGE_FAILED;
        }
    
        if (img_rep->size != scr->image.size ||
                img_rep->visual != scr->screen->root_visual ||
                img_rep->depth != scr->depth->depth)
        {
            free(img_rep);
            return SCR_ERR_GET_IMAGE_RACE_CONDITION;
        }
    
        free(img_rep);
        return 0;
    }
    
    int create_shm_seg_and_image(struct screenshoter *scr)
    {
        // check if sreen has non-zero dimensions
        if (scr->screen->width_in_pixels == 0 ||
                scr->screen->height_in_pixels == 0)
            return SCR_ERR_IMAGE_EMPTY;
    
        // XCB doesn't run on platforms with non-8bit char, so char is 8bits
        // We only support depth, bits_per_pixel and scanline_pad that is multiple
        // of whole bytes
        //
        // NOTE: shm extension seems to return packed image data, bits_per_pixel and scanline_pad
        //       are not used
        if (scr->depth->depth % 8 != 0)
            return SCR_ERR_UNSUPPORTED_VISUAL;
    
        size_t bytes_per_pixel = scr->depth->depth / 8;
    
        // Calculate stride, first multiply width by bytes_per_pixel
        size_t stride = scr->screen->width_in_pixels;
        if (SIZE_MAX / stride < bytes_per_pixel)
            return SCR_ERR_IMAGE_TOO_LARGE;
        stride *= bytes_per_pixel;
    
        // now multiply by height, to get image size in bytes
        scr->image.stride = stride;
        if (SIZE_MAX / stride < scr->screen->height_in_pixels)
            return SCR_ERR_IMAGE_TOO_LARGE;
        scr->image.size = stride * scr->screen->height_in_pixels;
    
        int shmid = shmget(IPC_PRIVATE, scr->image.size, IPC_CREAT | 0777);
        if (shmid == -1)
            return SCR_ERR_SHMGET_FAILED;
    
        scr->image.data = shmat(shmid, NULL, 0);
        if (scr->image.data == (void*)-1) {
            shmctl(shmid, IPC_RMID, NULL);
            return SCR_ERR_SHM_ATTACH_FAILED;
        }
    
        // Generate shm segment id
        scr->shm_seg = xcb_generate_id(scr->con);
        // attach our file to it, use checked call so we can block for reply
        xcb_void_cookie_t attach_ck = xcb_shm_attach_checked(scr->con,
                scr->shm_seg, shmid, 0);
        // wait for reply
        xcb_generic_error_t *attach_err = xcb_request_check(scr->con, attach_ck);
        // we don't need shmid anymore after the request was processed by X
        shmctl(shmid, IPC_RMID, NULL);
        // check attach error
        if (attach_err) {
            free(attach_err);
            shmdt(scr->image.data);
            return SCR_ERR_SHM_ATTACH_FAILED;
        }
    
        return 0;
    }
    
    void free_shm_seg_and_image(struct screenshoter *scr)
    {
        xcb_shm_detach(scr->con, scr->shm_seg);
        shmdt(scr->image.data);
    }
    
    int find_default_screen(struct screenshoter *scr)
    {
        if (scr->screen_num < 0)
            return SCR_ERR_INVALID_SCREEN;
        
        xcb_screen_iterator_t iter = xcb_setup_roots_iterator(scr->setup);
        for (int i = 0; i < scr->screen_num; ++i) {
            if (iter.rem == 0)
                return SCR_ERR_INVALID_SCREEN;
            xcb_screen_next(&iter);
        }
        scr->screen = iter.data;
        return 0;
    }
    
    int detect_root_visual(struct screenshoter *scr)
    {
        xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(scr->screen);
        for (;;) {
            xcb_depth_t const *depth = depth_iter.data;
            int visuals_len = xcb_depth_visuals_length(depth);
            if (visuals_len <= 0)
                break;
            xcb_visualtype_t const *visuals = xcb_depth_visuals(depth);
    
            for (int i = 0; i < visuals_len; ++i) {
                if (visuals[i].visual_id == scr->screen->root_visual) {
                    scr->depth = depth;
                    scr->visual = &visuals[i];
                    return 0;
                }
            }
    
            if (depth_iter.rem == 0)
                break;
            xcb_depth_next(&depth_iter);
        }
    
        return SCR_ERR_INVALID_VISUAL;
    }
    
    int detect_pixmap_format(struct screenshoter *scr)
    {
        int formats_len = xcb_setup_pixmap_formats_length(scr->setup);
        if (formats_len > 0) {
            xcb_format_t const *formats = xcb_setup_pixmap_formats(scr->setup);
            for (int i = 0; i < formats_len; ++i) {
                if (formats[i].depth == scr->depth->depth) {
                    scr->pixformat = &formats[i];
                    return 0;
                }
            }
        }
        return SCR_ERR_INVALID_PIXMAP_FORMAT;
    }
    
    int get_screenshot(void)
    {
        struct screenshoter scr;
        int err = 0;
    
        // connect
        scr.con = xcb_connect(NULL, &scr.screen_num);
        if (!scr.con)
            return SCR_ERR_CONNECTION_FAIL;
    
        // check errors
        if (xcb_connection_has_error(scr.con)) {
            err = SCR_ERR_CONNECTION_ERR;
            goto retDisconnect;
        }
    
        // get setup and prefetch shm extension
        scr.setup = xcb_get_setup(scr.con);
        xcb_prefetch_extension_data(scr.con, &xcb_shm_id);
        xcb_flush(scr.con);
    
        // find screen
        err = find_default_screen(&scr);
        if (err != 0)
            goto retDisconnect;
    
        // detect visual
        err = detect_root_visual(&scr);
        if (err != 0)
            goto retDisconnect;
    
        // and pixmap format for root depth
        err = detect_pixmap_format(&scr);
        if (err != 0)
            goto retDisconnect;
    
        // get shm extension
        scr.shm_ext = xcb_get_extension_data(scr.con, &xcb_shm_id);
        if (!scr.shm_ext->present) {
            err = SCR_ERR_SHM_NOT_SUPPORTED;
            goto retDisconnect;
        }
    
        // create shm segment
        err = create_shm_seg_and_image(&scr);
        if (err != 0)
            goto retDisconnect;
    
        err = receive_screenshot(&scr);
        if (err == 0) {
            // TODO: process image data here
    
            // Image data is in scr.image.data, its bytesize is in scr.image.size,
            // its stride bytesize is in scr.image.stride, its width is in
            // scr.screen->width_in_pixels, height in scr.screen->height_in_pixels,
            // depth (in bits) is in scr.depth->depth. Visual format is in
            // scr.visual (red_mask, green_mask, blue_mask). Image data byteorder is
            // in scr.setup->image_byte_order
        }
    
        free_shm_seg_and_image(&scr);
        xcb_flush(scr.con);
    retDisconnect:
        xcb_disconnect(scr.con);
        return err;
    }
    
    
    int main()
    {
        int err = get_screenshot();
        fprintf(stderr, "err = %d\n", err);
    
        return 0;
    }
    
    
    1.3.2016 12:13 Marecek
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++

    To je super, zacina mi to pozvolna "tapat", z ceho to je vykostene (pokud z neceho vetsiho) ?

    Marecek

    2.3.2016 12:19 Jardík
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    Né, napsal jsem to sám podle dokumentace k xcb. Je to v public domain, můžeš si s tém dělat, co chceš.
    2.3.2016 12:24 Jardík
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    Jinak komentáře jsou občas mimo, já to pak editoval a nějaké jsem nezměnil. Třeba místo shmget() jsem tam měl memfd_create(), ale pak jsem zjistil, že je to docela nový syscall a že ani není wrapper v glibc, co je v ubuntu 15.10 no tomhle pc, tak jsem to na poslední chvíli měnil a snad nenasekal moc chyb.
    2.3.2016 22:03 jkkjflsj
    Rozbalit Rozbalit vše Re: Screenshot obrazovky C/C++
    Nejsem si úplně jistý, jak moc je myšlena otázka vážně, případně jak moc vážně jsou myšlené odpovědi. Nicméně snadné řešení jak screnshotů tak socketů poskytuje kde jaká knihovna. Mě osobně se pohodlně pracuje s wxWidgets.

    Pokud mermomocí vyžadujete jen tu nejzákladnější (xlib), pak mě příjde odpověď How do take a screenshot correctly with xlib? vyčerpávající. Člověk může být akorát na rozpacích z formátu do kterého se obrázek ukládá.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.