#!perl -w
#######################################################################
#
# Perl Image Viewer
#
#######################################################################
use strict;
use warnings;
use FindBin();
use Win32::GUI qw(MB_ICONQUESTION MB_ICONINFORMATION MB_YESNOCANCEL);
use Win32::GUI::DIBitmap;
my @PIVReadFilter;
my @PIVSaveFilter;
my $PIVDirectory;
my $PIVDib;
my $PIVFile = "";
PIVInit ();
my $Menu = Win32::GUI::MakeMenu(
"&File" => "File",
" > &Open..." => "FileOpen",
" > -" => 0,
" > &Save" => "FileSave",
" > &Save As..." => "FileSaveAs",
" > -" => 0,
" > &Directory..." => "FileDirectory",
" > -" => 0,
" > E&xit" => "FileExit",
"&Image" => "Image",
" > &Properties..." => "ImageProperties",
" > -" => 0,
" > &Convert" => "ImageConvert",
" >> &8bits" => "ImageConvert8bits",
" >> &16bits" => "ImageConvert16bits",
" >> &24bits" => "ImageConvert24bits",
" >> &32bits" => "ImageConvert32bits",
" > -" => 0,
" > Color &Quantize" => "ImageColor",
" >> Methode WUQUANT" => "ImageColor1",
" >> Methode NNQUANT" => "ImageColor2",
"&Help" => "Help",
" > &About PIV" => "HelpAbout",
);
my $Window = new Win32::GUI::Window(
-name => "Window",
-title => "Perl Image Viewer",
-pos => [100, 100],
-size => [400, 400],
-menu => $Menu,
);
$Window->AddGraphic(
-name => "Graphic",
-pos => [0, 0],
-size => [$Window->ScaleWidth,$Window->ScaleHeight],
);
my $WProp = new Win32::GUI::DialogBox(
-title => "Image Properties",
-left => 110,
-top => 110,
-width => 400,
-height => 150,
-name => "WProp",
);
$WProp->AddLabel (
-name => "pFile",
-text => "File :",
-pos => [10, 25],
-size => [$WProp->ScaleWidth()-20, 20],
);
$WProp->AddLabel (
-name => "pWidth", -pos => [10, 25],
-size => [280, 20]
-text => "Width :",
-pos => [10, 50],
-size => [200, 20]
);
$WProp->AddLabel (
-name => "pHeight",
-text => "Height :",
-pos => [10, 75],
-size => [200, 20]
);
$WProp->AddLabel (
-name => "pBPP",
-text => "BPP :",
-pos => [10, 100],
-size => [200, 20]
);
$WProp->AddButton (
-name => "WPropClose",
-text => "Close",
-pos => [$WProp->ScaleWidth()-50, $WProp->ScaleHeight()-30],
);
PIVMenu();
$Window->Show();
Win32::GUI::Dialog();
#######################################################################
#
# PIV Functions
#
#######################################################################
sub PIVInit {
#
# Init PIVLoadFilter and PIVSaveFilter
#
my %ReadFilter;
my %SaveFilter;
my $count = Win32::GUI::DIBitmap::GetFIFCount();
my $list = "";
for (my $fif = 0; $fif < $count; $fif++) {
my $ext = Win32::GUI::DIBitmap::FIFExtensionList($fif);
my $desc = Win32::GUI::DIBitmap::FIFDescription($fif);
my $read = Win32::GUI::DIBitmap::FIFSupportsReading($fif);
my $write = Win32::GUI::DIBitmap::FIFSupportsWriting($fif);
$desc .= " (*." . join (',*.', split ( ',', $ext)) . ")";
$ext = "*." . join (';*.', split ( ',', $ext));
if (Win32::GUI::DIBitmap::FIFSupportsReading($fif)) {
$ReadFilter {"$desc"} = $ext;
$list .= ";$ext";
}
if (Win32::GUI::DIBitmap::FIFSupportsWriting($fif)) {
$SaveFilter {"$desc"} = $ext;
}
}
push @PIVReadFilter, "All PIV Files", $list;
foreach my $i (sort keys %ReadFilter) {
push @PIVReadFilter, $i, $ReadFilter{$i};
}
foreach my $i (sort keys %SaveFilter) {
push @PIVSaveFilter, $i, $SaveFilter{$i};
}
#
# init PIVDirectory
#
$PIVDirectory = $FindBin::Bin;
$PIVDirectory =~ tr/\//\\/;
}
sub PIVMenu {
if (defined $PIVDib) {
$Menu->{ImageProperties}->Enabled(1);
$Menu->{ImageConvert}->Enabled(1);
my $bpp = $PIVDib->GetBPP();
$Menu->{ImageColor}->Enabled($bpp == 24);
$Menu->{ImageConvert8bits}->Enabled($bpp != 8);
$Menu->{ImageConvert16bits}->Enabled($bpp != 16);
$Menu->{ImageConvert24bits}->Enabled($bpp != 24);
$Menu->{ImageConvert32bits}->Enabled($bpp != 32);
$Menu->{FileSave}->Enabled(1);
$Menu->{FileSaveAs}->Enabled(1);
}
else {
$Menu->{ImageProperties}->Enabled(0);
$Menu->{ImageConvert}->Enabled(0);
$Menu->{ImageColor}->Enabled(0);
$Menu->{FileSave}->Enabled(0);
$Menu->{FileSaveAs}->Enabled(0);
}
}
sub PIVAdjustDisplay {
if (defined $PIVDib) {
my $w = $Window->Width - $Window->ScaleWidth;
my $h = $Window->Height - $Window->ScaleHeight;
$Window->Resize ($PIVDib->Width + $w, $PIVDib->Height + $h);
}
}
sub PIVFinish {
undef $PIVDib;
return -1;
}
#######################################################################
#
# Window Event
#
#######################################################################
sub Window_Terminate {
return PIVFinish();
}
sub Window_Resize {
$Window->Graphic->Resize($Window->ScaleWidth, $Window->ScaleHeight);
}
#######################################################################
#
# Graphic Event
#
#######################################################################
sub Graphic_Paint {
my $DC = $Window->Graphic->GetDC();
if (defined $PIVDib) {
# $PIVDib->CopyToDC($DC);
$PIVDib->AlphaCopyToDC($DC);
}
$DC->Validate();
}
#######################################################################
#
# File Menu
#
#######################################################################
sub FileOpen_Click {
my $ret = Win32::GUI::GetOpenFileName(
-title => "Open Image File",
-filter => \@PIVReadFilter,
-directory => $PIVDirectory,
);
if ($ret) {
undef $PIVDib;
$PIVDib = newFromFile Win32::GUI::DIBitmap ($ret);
$PIVFile = $ret;
PIVAdjustDisplay ();
PIVAdjustDisplay ();
PIVMenu();
}
elsif (Win32::GUI::CommDlgExtendedError()) {
Win32::GUI::MessageBox (0, "ERROR : ".Win32::GUI::CommDlgExtendedError(),
"GetOpenFileName Error");
}
}
sub FileSave_Click {
my $ret = Win32::GUI::MessageBox (0, "Overwrite existing file ?",
"About",MB_ICONQUESTION | MB_YESNOCANCEL);
if ($ret == 6) {
$ret = $PIVDib->SaveToFile ($PIVFile);
unless ($ret) {
Win32::GUI::MessageBox (0, "ERROR : SaveToFile failed\r\nDoes the save format you selected support the BPP of the current image?", "Save Error");
}
}
elsif ($ret == 7) {
FileSaveAs_Click();
}
}
sub FileSaveAs_Click {
my $ret = Win32::GUI::GetSaveFileName(
-title => "Save Image File As",
-filter => \@PIVSaveFilter,
-directory => $PIVDirectory,
);
if ($ret) {
print "$ret\n";
$PIVFile = $ret;
$ret = $PIVDib->SaveToFile ($PIVFile);
unless ($ret) {
Win32::GUI::MessageBox (0, "ERROR : SaveToFile failed\r\nDoes the save format you selected support the BPP of the current image?", "Save Error");
}
}
elsif (Win32::GUI::CommDlgExtendedError()) {
Win32::GUI::MessageBox (0, "ERROR : ".Win32::GUI::CommDlgExtendedError(),
"GetSaveFileName Error");
}
}
sub FileDirectory_Click {
my $ret = Win32::GUI::BrowseForFolder (
-title => "Select default directory",
-directory => $PIVDirectory,
-folderonly => 1,
);
$PIVDirectory = $ret if ($ret);
return 0;
}
sub FileExit_Click {
return PIVFinish();
}
#######################################################################
#
# Image Menu
#
#######################################################################
sub ImageProperties_Click {
if (defined $PIVDib) {
$Window->Disable();
$WProp->pFile->Text("File : ".$PIVFile);
$WProp->pWidth->Text("Width : ".$PIVDib->Width());
$WProp->pHeight->Text("Height : ".$PIVDib->Height());
$WProp->pBPP->Text("BPP,Colors useds,Color type : ".$PIVDib->GetBPP().
",".$PIVDib->GetColorsUsed().
",".$PIVDib->GetColorType());
$WProp->Show();
}
}
sub ImageConvert8bits_Click {
$PIVDib = $PIVDib->ConvertTo8Bits();
Graphic_Paint();
PIVMenu();
}
sub ImageConvert16bits_Click {
$PIVDib = $PIVDib->ConvertTo16Bits555();
Graphic_Paint();
PIVMenu();
}
sub ImageConvert24bits_Click {
$PIVDib = $PIVDib->ConvertTo24Bits();
Graphic_Paint();
PIVMenu();
}
sub ImageConvert32bits_Click {
$PIVDib = $PIVDib->ConvertTo32Bits();
Graphic_Paint();
PIVMenu();
}
sub ImageColor1_Click {
$PIVDib = $PIVDib->ColorQuantize(FIQ_WUQUANT);
Graphic_Paint();
PIVMenu();
}
sub ImageColor2_Click {
$PIVDib = $PIVDib->ColorQuantize(FIQ_NNQUANT);
Graphic_Paint();
PIVMenu();
}
#######################################################################
#
# Help Menu
#
#######################################################################
sub HelpAbout_Click {
Win32::GUI::MessageBox (0, "Perl Image Viewer 1.0 by Laurent Rocher",
"About",MB_ICONINFORMATION);
}
#######################################################################
#
# Image Properties
#
#######################################################################
sub WPropClose_Click {
$WProp->Hide();
$Window->Enable();
$Window->SetForegroundWindow();
}