실행 중인 X 프로그램의 아이콘을 덤프하는 방법은 무엇입니까?

실행 중인 X 프로그램의 아이콘을 덤프하는 방법은 무엇입니까?

실행 중인 X 프로그램의 아이콘을 얻을 수 있는 방법이 있습니까? 예를 들어 xfwm4를 통해 창 간에 전환할 때 해당 아이콘을 볼 수 있습니다.

답변1

이것은 나에게 효과적입니다. 모든 응용 프로그램 및 모든 창 관리자에서는 작동하지 않을 수 있습니다. 이 pam형식은 최소한 ImageMagick에서 지원되므로 다음을 사용하여 display필요한 경우 이를 보고 다른 형식으로 변환 할 수 있습니다 convert.

xprop -notype 32c _NET_WM_ICON |
  perl -0777 -pe '@_=/\d+/g;
    printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
    $_=pack "N*", @_;
    s/(.)(...)/$2$1/gs' > icon.pam

(그런 다음 아이콘을 가져오려는 창을 클릭하고 xprop의 -id옵션도 참조하세요)

아이디어는 xprop를 사용하여 속성을 32비트 십진 정수 목록으로 가져오고 이를 Perl을 사용하여 그래픽 형식으로 변환하는 것입니다. 여기서는 단순성을 위해 pam을 선택했지만 _NET_WM_ICON은 ARGB이고 pam은 바이트를 다시 정렬해야 했습니다. RGBA.

(pam 형식에 대한 참고 사항. 그것은네트워크 PBM형식의 netpbm은 오래된 Unix 이미지 처리 도구 상자입니다. 그러나 다양한 문제(주로 라이센스 문제)로 인해 최신 netpbm 버전은 Debian 및 그 파생 버전(예: Ubuntu)에 의해 패키지되지 않습니다. 이는 대부분의 pam 변환 유틸리티가 존재하지 않음을 의미합니다. 최신 netpbm을 사용하는 다른 시스템에서는 위의 출력을 파이프하여 pamrgbatopngpng 이미지를 생성할 수 있습니다.

답변2

기반으로@Stéphane Chazelas 놀라운 클립첫 번째 항목뿐만 아니라 다음 항목도 덤프하는 스크립트를 만들었습니다.모두특정 창에 이미지로 표시할 아이콘 .png:

#!/bin/bash
if [[ "$1" == '--help' ]]; then
    echo "Show information or extract a window's icons to NAME-WIDTH.png"
    echo "Usage: ${0##*/} [NAME]"
    exit
fi

if [[ "$1" ]]; then
    cmd=(convert -set 'filename:w' '%w' - "${1}-%[filename:w].png")
else
    cmd=(identify -)
fi

split_icons() {
    xprop -notype 32c _NET_WM_ICON |
    awk -v RS=', | = ' '
        NR == 1         { h  = $1; i++; next }
        NR == i + 1     { x  = $1;        printf "%s = %s", h, x; next }
        NR == i + 2     { s  = x * $1 } { printf ", %s", $1 }
        NR == i + 2 + s { i += s + 2;     printf "\n" }
    '
}

to_pam() {
    perl -0777 -pe '@_=/\d+/g;
    printf "P7\nWIDTH %d\nHEIGHT %d\n", splice@_,0,2;
    printf "DEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n";
    $_=pack "N*", @_;
    s/(.)(...)/$2$1/gs'
}

while read -r data; do to_pam <<< "$data" | "${cmd[@]}"; done < <(split_icons)

아이콘 정보 표시를 위한 매개변수가 없으면 identify파일이 생성되지 않습니다. 주어진 값을 기반으로 NAME아이콘을 추출하고 convert이를 사용하여 NAME-<width>.png.

사용 예:

$ extract-icons --help
Show information or extract a window's icons to NAME-WIDTH.png
Usage: extract-icons [NAME]

$ extract-icons  # ... click on firefox ...
-=>/tmp/magick-14339JS01_CgEl3Yi PAM 64x64 64x64+0+0 8-bit TrueColor sRGB 16.5KB 0.000u 0:00.000
-=>/tmp/magick-14342I14cdBFZKQIm PAM 16x16 16x16+0+0 8-bit TrueColor sRGB 1.09KB 0.000u 0:00.000
-=>/tmp/magick-14345gjMYsrl4Jhmh PAM 128x128 128x128+0+0 8-bit TrueColor sRGB 65.6KB 0.000u 0:00.000
-=>/tmp/magick-14348Wdmu9LGUEH0j PAM 32x32 32x32+0+0 8-bit TrueColor sRGB 4.16KB 0.000u 0:00.000
-=>/tmp/magick-14351HICEECbK3LRi PAM 48x48 48x48+0+0 8-bit TrueColor sRGB 9.28KB 0.000u 0:00.000

$ extract-icons firefox
$ ls -l
total 36.864
-rw-r--r-- 1 rodrigo rodrigo 14.882 2020-09-16 18:44 firefox-128.png
-rw-r--r-- 1 rodrigo rodrigo  1.175 2020-09-16 18:44 firefox-16.png
-rw-r--r-- 1 rodrigo rodrigo  2.265 2020-09-16 18:44 firefox-32.png
-rw-r--r-- 1 rodrigo rodrigo  3.870 2020-09-16 18:44 firefox-48.png
-rw-r--r-- 1 rodrigo rodrigo  5.996 2020-09-16 18:44 firefox-64.png

전체 스크립트를 얻고 아래와 같은 몇 가지 옵션을 추가할 수 있습니다.xdg-extract-iconsxdg-tools 저장소

답변3

나는 우연히 우연히 발견했다이것블로그 게시물. 인용하자면:

실제로 이를 수행하는 방법을 보여주기 위해 저는 다음과 같은 작은 프로그램을 작성했습니다.그래픽 아이콘이를 통해 사용자는 실행 중인 X 응용 프로그램의 창을 선택하고 추출된 아이콘을 인수로 제공되는 파일에 저장할 수 있습니다.

답변4

Linux libwnck를 사용하여 수행할 수 있습니다.

#define WNCK_I_KNOW_THIS_IS_UNSTABLE = 1

#include <libwnck/libwnck.h>

int main(int argc,
         char **argv) {
    WnckScreen *screen;

    gdk_init(&argc, &argv);

    screen = wnck_screen_get_default();

    wnck_screen_force_update(screen);

    auto win = wnck_window_get(127926341); // 127926341 is window id, it can be get by linux cli xdotool or wmctrl or other many clis
    GdkPixbuf *r = wnck_window_get_icon(win);
    GError *err = NULL;
    gdk_pixbuf_save(r, "/tmp/prpr.png", "png", &err, "quality", "100", NULL);
    return 0;
}

나는 출신이 페이지

관련 정보