Câu trả lời:
Điều này làm việc cho tôi. Có thể không hoạt động với tất cả các ứng dụng và tất cả các trình quản lý cửa sổ. Các pam
định dạng là ít nhất được hỗ trợ bởi ImageMagick, vì vậy bạn có thể xem nó với display
và chuyển đổi nó sang các định dạng khác nếu cần thiết với 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
(và nhấp vào cửa sổ bạn muốn lấy biểu tượng từ đó, xem thêm -id
tùy chọn của xprop )
Ý tưởng là sử dụng xprop để lấy thuộc tính dưới dạng danh sách các số nguyên thập phân 32 bit và sử dụng perl để chuyển đổi nó thành định dạng đồ họa (pam được chọn ở đây để đơn giản mặc dù tôi phải sắp xếp lại các byte vì _NET_WM_ICON là ARGB trong khi pam là RGBA.
( một lưu ý về định dạng pam . Đây là định dạng netpbm , netpbm là một hộp công cụ xử lý hình ảnh Unix đáng kính. Tuy nhiên, do nhiều vấn đề khác nhau, chủ yếu là cấp phép, các phiên bản netpbm mới hơn không phải là gói của debian và do đó các dẫn xuất của nó như ub Ubuntu như tốt, điều đó có nghĩa là hầu hết các tiện ích chuyển đổi pam không có ở đó. Trên các hệ thống khác có netpbm mới hơn, bạn có thể đặt đầu ra ở trên pamrgbatopng
để tạo hình ảnh png)
sử dụng linux libwnck có thể làm điều đó
#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;
}
Tôi lấy nó từ trang này