12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <libexif/exif-data.h>
- #define BOLD_GRAY "\033[1;90m"
- #define RED "\033[0;31m"
- #define WHITE "\033[0;37m"
- #define RESET "\033[0m"
- int module_11_run(const char *filename) {
- char log_msg[1024];
- // Открываем файл для проверки
- FILE *file = fopen(filename, "rb");
- if (!file) {
- snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "File type not recognized: %s" RESET, strerror(errno));
- printf("%s\n", log_msg);
- return 1;
- }
- // Проверяем сигнатуру JPEG
- unsigned char buffer[2];
- size_t read_bytes = fread(buffer, 1, 2, file);
- fclose(file);
- if (read_bytes != 2 || buffer[0] != 0xFF || buffer[1] != 0xD8) {
- snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "Not a JPEG file" RESET);
- printf("%s\n", log_msg);
- return 1;
- }
- // Загружаем EXIF-данные
- ExifData *ed = exif_data_new_from_file(filename);
- if (!ed) {
- snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "No EXIF data found" RESET);
- printf("%s\n", log_msg);
- return 1;
- }
- // Переменные для хранения EXIF-данных
- char resolution[32] = "Unknown";
- char date_time[32] = "Unknown";
- char camera_model[64] = "Unknown";
- char gps_info[128] = "None"; // Увеличен размер до 128 для длинных строк
- // Извлекаем разрешение
- ExifEntry *entry_x = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_X_DIMENSION);
- ExifEntry *entry_y = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_Y_DIMENSION);
- if (entry_x && entry_y) {
- char x_str[16], y_str[16];
- exif_entry_get_value(entry_x, x_str, sizeof(x_str));
- exif_entry_get_value(entry_y, y_str, sizeof(y_str));
- snprintf(resolution, sizeof(resolution), "%sx%s", x_str, y_str);
- }
- // Извлекаем дату съёмки
- ExifEntry *entry_date = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_DATE_TIME_ORIGINAL);
- if (entry_date) {
- exif_entry_get_value(entry_date, date_time, sizeof(date_time));
- }
- // Извлекаем модель камеры
- ExifEntry *entry_model = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MODEL);
- if (entry_model) {
- exif_entry_get_value(entry_model, camera_model, sizeof(camera_model));
- }
- // Извлекаем геолокацию
- ExifEntry *entry_lat = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE);
- ExifEntry *entry_lon = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE);
- if (entry_lat && entry_lon) {
- char lat_str[32], lon_str[32];
- exif_entry_get_value(entry_lat, lat_str, sizeof(lat_str));
- exif_entry_get_value(entry_lon, lon_str, sizeof(lon_str));
- snprintf(gps_info, sizeof(gps_info), "Lat: %s, Lon: %s", lat_str, lon_str);
- }
- // Формируем вывод
- snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " WHITE "Resolution: %s, Taken: %s, Camera: %s, GPS: %s" RESET,
- resolution, date_time, camera_model, gps_info);
- printf("%s\n", log_msg);
- // Освобождаем ресурсы
- exif_data_unref(ed);
- return 0;
- }
|