[Digikam-devel] Proof of concept: using ExifTool in C++

Thorsten Schnebeck thorsten.schnebeck at gmx.net
Sun Oct 16 13:11:15 BST 2005


Hi list, hi Phil,

as you know I'm still on my way in promoting ExifTool and this weekend I had a 
little bit time to program.

As a proof of concept I programmed a new kfile_rawimage- and 
rawimage_thumbnail service using ExifTool in KDE.
For security reasons I did not use ExifTool as a script but feeding libperl 
with a Perl program in C++ using the Image::ExifTool Perl library.

Speed impact is not as bad as I thought at the beginning but this has also 
something to do, that the original kcamerarawplugin from kdegraphics uses 
temp files I do not need with ExifTool. For single file handling its really 
ok and thumbnails are cached anyway.

When I compare my kfile_rawimage with kfile_jpeg I see, that using ExifTool is 
nearly the same straight forward than using the old and not more up-to-date 
libexif.

Here is a code extract:

extern "C" {
  #include <INTERN.h>
  #include <perl.h>
  static PerlInterpreter *MyPerl;
}

bool rawimagePlugin::readInfo( KFileMetaInfo& info, uint what) {
  KFileMetaInfoGroup group = appendGroup(info, "RAWInfo");
  const QString path(info.path());
  if ( path.isEmpty() ) return false; // remote file

  // setup Perl program
  STRLEN n_a;
  char *embedding[] = {"", "-e", "0"};
  QString exiftool = "my $file=\"" + QFile::encodeName(path) + \
      "\";use Image::ExifTool; my $exiftool = new Image::ExifTool;" + \
      "$exiftool->Options(PrintConv => 1);" + \
      "$info = $exiftool->ImageInfo($file);";

  // run Perl program
  MyPerl = perl_alloc();
  perl_construct( MyPerl );
  perl_parse(MyPerl, NULL, 3, embedding, (char **)NULL);
  PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
  perl_run(MyPerl);
  perl_eval_pv((char*) exiftool.latin1(), TRUE);
  perl_eval_pv((char*) "$return=$$info{'Make'};", TRUE);
  QString make=SvPV(perl_get_sv("return", FALSE), n_a);

  perl_eval_pv((char*) "$return=$$info{'Model'};", TRUE);
  QString model=SvPV(perl_get_sv("return", FALSE), n_a);

  perl_eval_pv((char*) "$return=$$info{'FocalLength'};", TRUE);
  QString focal=SvPV(perl_get_sv("return", FALSE), n_a);

  perl_eval_pv((char*) "$return=$$info{'Aperture'};", TRUE);
  QString aperture=SvPV(perl_get_sv("return", FALSE), n_a);

  perl_destruct(MyPerl);
  perl_free(MyPerl);
  PERL_SYS_TERM();

Watching this service in action please look the screenshot at
http://forum.ebv4linux.de/download.php?id=215
As you can see the new code supports the rotation flag and thumbnail 
generating of RAW files.
If I know how to handle mimetype magic and deinstallation of the old mimetype 
handler I can publish the code as a kdevelop project. 

Bye

  Thorsten




More information about the Digikam-devel mailing list