Preview Raw Images - PreviewImage

Started by pfelipe, October 13, 2012, 02:54:48 AM

Previous topic - Next topic

pfelipe

Hi Phil,

I'm writing a perl/tk app and I would like to display a preview of raw files (Nikon NEF).

Is it practical to use PreviewImage for that? something like...

$nefpreviewWindow = $mw->Toplevel();

# got this from another post here:
my $exifTool = new Image::ExifTool;
my $info = $exifTool->ImageInfo($myFile,'JpgFromRaw','PreviewImage');
my $val = $$info{JpgFromRaw} || $$info{PreviewImage};
$val or die "No embedded JPG in $myFile\n";

$nefimagePreviewButton=$nefpreviewWindow->Button(
    -image=>$$val,
)->pack();

Or would I have to create a temporary file with the contents for $$val and then use this file as the Button image? My concern here is disk i/o could slow down the image preview...

Or could there be an easier method to show a preview of raw images?

Thank you,
Felipe.

Phil Harvey

Hi Felipe,

I'm sorry, I can't help you here.  I don't even know what graphics package you are using, and I have never done this myself.

Perhaps you will have more success asking in a forum with people that use this graphics package.

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

pfelipe

This is what happens when you are too tired to troubleshoot... but insist to continue on... I should have learnt this lesson already...

8)

For reference, I got this working as follows:


# just a small extraction of my script... in case you wonder why there are no widgets on $mw...
use warnings;
use strict;

use Image::ExifTool;
use MIME::Base64;

$mw = MainWindow->new;

my $myFile=".\DSC_0001.NEF";

my $nefpreviewWindow = $mw->Toplevel();
$nefpreviewWindow->geometry("610x410");
my $exifTool = new Image::ExifTool;
# It seems no PreviewImage on Nikon NEF... using JpgFromRaw instead
my $info = $exifTool->ImageInfo($myFile,'JpgFromRaw');
my $val = $$info{JpgFromRaw} ;

my $nefmyImage=$nefpreviewWindow->Photo(
    'nef',
    -data=>encode_base64($$val)
);
my $nefsmallImage=$nefpreviewWindow->Photo('Preview');
my $imgFactor = &max(
    &factor( $nefmyImage->width, 600 ),
    &factor( $nefmyImage->height, 400 ),
);

$nefsmallImage->copy(
    $nefmyImage,
   -shrink,
   -subsample=> $imgFactor,$imgFactor
);


my $nefimagePreviewButton=$nefpreviewWindow->Button(
        -image=>$nefsmallImage,
)->pack();

sub factor {
    my( $n, $m ) = @_;
    ($n>$m) ? int($n/$m) : 1
}

sub max {
        my( $n, $m ) = @_;
        $n > $m ? $n : $m
}



Thank you Phill for a great tool!
:D

pfelipe

I was also able to use PerlMagick, but it is considerably slower to display the image preview (maybe it is the way I did it...)... also, the image looks darker when compared with the exifTool method above...

Anyway, here is how to do it with PerlMagick for those interested in displaying a preview of a raw file:

use MIME::Base64;
use Image::Magick;

$nefpreviewWindow = $mw->Toplevel();
$nefpreviewWindow->geometry("610x410");
      
$neffullImage=Image::Magick->new;
# read NEF file
$neffullImage->Read($myFile);
#convert to jpeg
$neffullImage->Set(magick=>'jpeg');
#scale image to preview size
$neffullImage->Scale(Geometry=>'600x400');

# store image in a Blob variable
my $nefmyImageData = $neffullImage->ImageToBlob() ;
      
$nefmyImage=$nefpreviewWindow->Photo(
    'Previewnef',
    #convert it to base64 to be used by widget
    -data=>encode_base64($nefmyImageData)
);
# memory cleaning
undef $nefmyImageData;      
# display preview image
$nefimagePreviewButton=$nefpreviewWindow->Button(
    -image=>$nefmyImage,
)->pack();

# memory cleaning
#undef $neffullImage;
@$neffullImage = ();

$nefpreviewWindow->configure(-title=>$myFile);
$nefimagePreviewButton->update;
select(undef, undef, undef, .1);


Regards,
Felipe.