summaryrefslogtreecommitdiff
path: root/jpeg-utils.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2008-08-02 13:50:16 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2008-08-02 13:50:16 +0200
commit1e355114311d7bf44b96b11b745857a2b68e8a06 (patch)
treee9e63419c60b1668a22bceda4447794469db21ba /jpeg-utils.c
parent64c8713ab4a64eaf53a764530837bd3ae47a89d2 (diff)
downloadcataract-1e355114311d7bf44b96b11b745857a2b68e8a06.tar.xz
Port to exiv2 library
Now we are able to read EXIF, IPTC and JPEG metadata such as caption, copyright, author etc. though we don't display them anywhere yet. Fixes weird shutter times.
Diffstat (limited to 'jpeg-utils.c')
-rw-r--r--jpeg-utils.c280
1 files changed, 0 insertions, 280 deletions
diff --git a/jpeg-utils.c b/jpeg-utils.c
deleted file mode 100644
index dc1c880..0000000
--- a/jpeg-utils.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/* Cataract - Static web photo gallery generator
- * Copyright (C) 2008 Tomas Bzatek <tbzatek@users.sourceforge.net>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <libexif/exif-data.h>
-#include <libexif/exif-content.h>
-#include <libexif/exif-entry.h>
-
-#include <wand/magick-wand.h>
-
-#include "jpeg-utils.h"
-
-
-
-
-/*
- * get_exif: retrieve EXIF informations from a JPEG image
- */
-int
-get_exif (const char *filename, TExifData *data)
-{
- ExifData *edata;
- ExifEntry *entry;
- ExifContent *content;
- int i, j;
-
- if (data == NULL)
- data = malloc (sizeof (TExifData));
- memset (data, 0, sizeof (TExifData));
- edata = exif_data_new_from_file (filename);
- if (edata == NULL)
- return -1;
-
- for (i = 0; i < EXIF_IFD_COUNT; i++) {
- content = edata->ifd[i];
- if ((content == NULL) || (content->count == 0))
- continue;
-
- for (j = 0; j < content->count; j++) {
- entry = content->entries[j];
-
- if (! content->entries[j])
- continue;
-
- #define VALUE_LEN 1024
- char value[VALUE_LEN + 1];
-
- switch (entry->tag)
- {
- case EXIF_TAG_DATE_TIME:
- data->datetime = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_DATE_TIME_ORIGINAL:
- case EXIF_TAG_DATE_TIME_DIGITIZED:
- if (data->datetime == NULL)
- data->datetime = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_MODEL:
- if (data->camera_model == NULL)
- data->camera_model = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_MAKE:
- if (data->camera_model == NULL)
- data->camera_model = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_ISO_SPEED_RATINGS:
- data->iso = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_FOCAL_LENGTH:
- data->focal_length = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM:
- data->focal_length_35mm = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_FNUMBER:
- data->aperture = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_APERTURE_VALUE:
- if (data->aperture == NULL)
- data->aperture = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_EXPOSURE_TIME:
- data->exposure = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_FLASH:
- data->flash = strdup (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_PIXEL_X_DIMENSION:
- data->width = atol (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- case EXIF_TAG_PIXEL_Y_DIMENSION:
- data->height = atol (exif_entry_get_value (entry, value, VALUE_LEN));
- break;
-
- default:
- break;
- }
- }
- }
- exif_data_free (edata);
-
- #ifdef __DEBUG_ALL__
- printf("EXIF_TAG_DATE_TIME = %s\n", data->datetime);
- printf("EXIF_TAG_MODEL = %s\n", data->camera_model);
- printf("EXIF_TAG_ISO_SPEED_RATINGS = %s\n", data->iso);
- printf("EXIF_TAG_FOCAL_LENGTH = %s\n", data->focal_length);
- printf("EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM = %s\n", data->focal_length_35mm);
- printf("EXIF_TAG_FNUMBER = %s\n", data->aperture);
- printf("EXIF_TAG_EXPOSURE_TIME = %s\n", data->exposure);
- printf("EXIF_TAG_FLASH = %s\n", data->flash);
- printf("EXIF_TAG_PIXEL_X_DIMENSION = %lu\n", data->width);
- printf("EXIF_TAG_PIXEL_Y_DIMENSION = %lu\n", data->height);
- #endif
-
- return 0;
-}
-
-/*
- * free_exif_struct: free allocated structure
- */
-void
-free_exif_data (TExifData *data)
-{
- if (data) {
- if (data->aperture)
- free (data->aperture);
- if (data->camera_model)
- free (data->camera_model);
- if (data->datetime)
- free (data->datetime);
- if (data->exposure)
- free (data->exposure);
- if (data->flash)
- free (data->flash);
- if (data->focal_length)
- free (data->focal_length);
- if (data->focal_length_35mm)
- free (data->focal_length_35mm);
- if (data->iso)
- free (data->iso);
- free (data);
- data = NULL;
- }
-}
-
-
-/*
- * resize_image: resize image pointed by src and save result to dst
- */
-gboolean
-resize_image (const char *src, const char *dst,
- int size_x, int size_y,
- int quality)
-{
- #define ThrowWandException(wand) \
- { \
- char *description; \
- ExceptionType severity; \
- \
- description = MagickGetException (wand, &severity); \
- (void) fprintf (stderr, "Error converting image: %s %s %ld %s\n", GetMagickModule(), description); \
- description = (char*) MagickRelinquishMemory (description); \
- return FALSE; \
- }
-
- MagickBooleanType status;
- MagickWand *magick_wand;
-
- /* Read an image. */
- MagickWandGenesis();
- magick_wand = NewMagickWand();
- status = MagickReadImage (magick_wand, src);
- if (status == MagickFalse)
- ThrowWandException (magick_wand);
- MagickResizeImage (magick_wand, size_x, size_y, LanczosFilter, 1.0);
- MagickSetImageCompressionQuality (magick_wand, quality);
-
- /* Write the image and destroy it. */
- status = MagickWriteImage (magick_wand, dst);
- if (status == MagickFalse)
- ThrowWandException (magick_wand);
- magick_wand = DestroyMagickWand (magick_wand);
- MagickWandTerminus();
-
- return TRUE;
-}
-
-
-/*
- * get_image_sizes: retrieve image dimensions
- */
-void
-get_image_sizes (const char *img,
- unsigned long *width, unsigned long *height)
-{
- #define xThrowWandException(wand) \
- { \
- char *description; \
- ExceptionType severity; \
- \
- description = MagickGetException (wand, &severity); \
- (void) fprintf (stderr, "Error reading image info: %s %s %ld %s\n", GetMagickModule(), description); \
- description = (char*) MagickRelinquishMemory(description); \
- return; \
- }
-
- MagickBooleanType status;
- MagickWand *magick_wand;
-
- *width = -1;
- *height = -1;
-
- /* Read an image. */
- MagickWandGenesis();
- magick_wand = NewMagickWand();
- status = MagickPingImage (magick_wand, img);
- if (status == MagickFalse)
- xThrowWandException (magick_wand);
- *width = MagickGetImageWidth (magick_wand);
- *height = MagickGetImageHeight (magick_wand);
-
- magick_wand = DestroyMagickWand (magick_wand);
- MagickWandTerminus();
-}
-
-
-/*
- * calculate_sizes: calculate maximal image sizes within specified limits keeping aspect ratio
- */
-void
-calculate_sizes (const unsigned long max_width, const unsigned long max_height,
- unsigned long *width, unsigned long *height)
-{
- if ((max_width > *width) && (max_height > *height))
- return;
-
- double max_ratio = (double) max_width / (double) max_height;
- double real_ratio = (double) *width / (double) *height;
-
- if ((*width > *height) && (max_ratio <= real_ratio))
- {
- *height = max_width / real_ratio;
- *width = max_width;
- }
- else
- {
- *width = max_height * real_ratio;
- *height = max_height;
- }
-}
-