module_11.c 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <libexif/exif-data.h>
  6. #define BOLD_GRAY "\033[1;90m"
  7. #define RED "\033[0;31m"
  8. #define WHITE "\033[0;37m"
  9. #define RESET "\033[0m"
  10. int module_11_run(const char *filename) {
  11. char log_msg[1024];
  12. // Открываем файл для проверки
  13. FILE *file = fopen(filename, "rb");
  14. if (!file) {
  15. snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "File type not recognized: %s" RESET, strerror(errno));
  16. printf("%s\n", log_msg);
  17. return 1;
  18. }
  19. // Проверяем сигнатуру JPEG
  20. unsigned char buffer[2];
  21. size_t read_bytes = fread(buffer, 1, 2, file);
  22. fclose(file);
  23. if (read_bytes != 2 || buffer[0] != 0xFF || buffer[1] != 0xD8) {
  24. snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "Not a JPEG file" RESET);
  25. printf("%s\n", log_msg);
  26. return 1;
  27. }
  28. // Загружаем EXIF-данные
  29. ExifData *ed = exif_data_new_from_file(filename);
  30. if (!ed) {
  31. snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "No EXIF data found" RESET);
  32. printf("%s\n", log_msg);
  33. return 1;
  34. }
  35. // Переменные для хранения EXIF-данных
  36. char resolution[32] = "Unknown";
  37. char date_time[32] = "Unknown";
  38. char camera_model[64] = "Unknown";
  39. char gps_info[128] = "None"; // Увеличен размер до 128 для длинных строк
  40. // Извлекаем разрешение
  41. ExifEntry *entry_x = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_X_DIMENSION);
  42. ExifEntry *entry_y = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_Y_DIMENSION);
  43. if (entry_x && entry_y) {
  44. char x_str[16], y_str[16];
  45. exif_entry_get_value(entry_x, x_str, sizeof(x_str));
  46. exif_entry_get_value(entry_y, y_str, sizeof(y_str));
  47. snprintf(resolution, sizeof(resolution), "%sx%s", x_str, y_str);
  48. }
  49. // Извлекаем дату съёмки
  50. ExifEntry *entry_date = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_DATE_TIME_ORIGINAL);
  51. if (entry_date) {
  52. exif_entry_get_value(entry_date, date_time, sizeof(date_time));
  53. }
  54. // Извлекаем модель камеры
  55. ExifEntry *entry_model = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MODEL);
  56. if (entry_model) {
  57. exif_entry_get_value(entry_model, camera_model, sizeof(camera_model));
  58. }
  59. // Извлекаем геолокацию
  60. ExifEntry *entry_lat = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE);
  61. ExifEntry *entry_lon = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE);
  62. if (entry_lat && entry_lon) {
  63. char lat_str[32], lon_str[32];
  64. exif_entry_get_value(entry_lat, lat_str, sizeof(lat_str));
  65. exif_entry_get_value(entry_lon, lon_str, sizeof(lon_str));
  66. snprintf(gps_info, sizeof(gps_info), "Lat: %s, Lon: %s", lat_str, lon_str);
  67. }
  68. // Формируем вывод
  69. snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " WHITE "Resolution: %s, Taken: %s, Camera: %s, GPS: %s" RESET,
  70. resolution, date_time, camera_model, gps_info);
  71. printf("%s\n", log_msg);
  72. // Освобождаем ресурсы
  73. exif_data_unref(ed);
  74. return 0;
  75. }