当前位置:   article > 正文

C++ linux下使用X11实现屏幕截图(续)_x11截屏

x11截屏

使用libpng库将XGetImage获取到的内容保存为PNG格式的文件。以下是一个示例代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <X11/Xlib.h>
  4. #include <X11/Xutil.h>
  5. #include <png.h>
  6. void saveImageToPNG(XImage *image, const char *filename) {
  7. FILE *fp = fopen(filename, "wb");
  8. if (!fp) {
  9. fprintf(stderr, "Error: Failed to open file '%s' for writing.\n", filename);
  10. return;
  11. }
  12. png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  13. if (!png_ptr) {
  14. fprintf(stderr, "Error: Failed to create PNG write structure.\n");
  15. fclose(fp);
  16. return;
  17. }
  18. png_infop info_ptr = png_create_info_struct(png_ptr);
  19. if (!info_ptr) {
  20. fprintf(stderr, "Error: Failed to create PNG info structure.\n");
  21. png_destroy_write_struct(&png_ptr, NULL);
  22. fclose(fp);
  23. return;
  24. }
  25. if (setjmp(png_jmpbuf(png_ptr))) {
  26. fprintf(stderr, "Error: Failed to set PNG jump buffer.\n");
  27. png_destroy_write_struct(&png_ptr, &info_ptr);
  28. fclose(fp);
  29. return;
  30. }
  31. png_init_io(png_ptr, fp);
  32. png_set_IHDR(png_ptr, info_ptr, image->width, image->height, 8, PNG_COLOR_TYPE_RGBA,
  33. PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
  34. png_write_info(png_ptr, info_ptr);
  35. png_bytep *row_pointers = (png_bytep *)malloc(image->height * sizeof(png_bytep));
  36. for (int y = 0; y < image->height; y++) {
  37. row_pointers[y] = (png_bytep)(image->data + y * image->bytes_per_line);
  38. }
  39. png_write_image(png_ptr, row_pointers);
  40. png_write_end(png_ptr, NULL);
  41. free(row_pointers);
  42. png_destroy_write_struct(&png_ptr, &info_ptr);
  43. fclose(fp);
  44. }
  45. int main() {
  46. Display *display = XOpenDisplay(NULL);
  47. if (!display) {
  48. fprintf(stderr, "Error: Failed to open display.\n");
  49. return 1;
  50. }
  51. Window root = DefaultRootWindow(display);
  52. XImage *image = XGetImage(display, root, 0, 0, 1920, 1080, AllPlanes, ZPixmap);
  53. if (!image) {
  54. fprintf(stderr, "Error: Failed to get image from display.\n");
  55. XCloseDisplay(display);
  56. return 1;
  57. }
  58. saveImageToPNG(image, "screenshot.png");
  59. XDestroyImage(image);
  60. XCloseDisplay(display);
  61. return 0;
  62. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/430063
推荐阅读
相关标签
  

闽ICP备14008679号