Zur Website

Start Buchtipp Noch mehr Lösungen und Tricks Kontakt Copyright Impressum







Perl Modul:

Bilder manipulieren

Skalieren
Pixeldichte
Farbtiefe
Qualität (Kompression)
Schärfung
Drehen
Spiegeln

Nr.26

©2004



Erläuterung:

Die Subroutine IMG_CONVERT manimupliert ein als Filehandle gegebenes Bild.

Voraussetzung ist die Installation des für Linux und Windows gleichermaßen erhältlichen Moduls Image::Magick.

In der beiliegenden Datei PL0009.pm ist die Programmierung als eigenes Perl-Modul ausgeführt, lauffähig sowohl unter Linux/Perl als auch Windows/Active Perl.

Die Routine wandelt ein durch Filehandle gegebenes Bild in ein "Vorschaubild"
der vorgegebenen Maximalabmessungen um ("BreiteMax", "HoeheMax") und gibt
die neuen Werte zurueck. Die Proportionen werden beibehalten.
Ist das Orginalbild kleiner als die Max-Masse, bleiben die Masse
unveraendert und werden als tatsaechliche Masse in "BreiteAktuell"
und "HoheAktuell" zurueckgegeben.

FileHandle Uebergabebeispiel:
use LWP::Simple;
$pic = get( 'http://localhost/test2.jpg' );
&IMG_CONVERT( FileHandle => \$pic );

PixDichte beschreibt die Pixeldichte des Vorschaubildes, wird in aller
Regel 72 (dpi) sein

Format legt einen der für das Internet moeglichen Formattyp fest;
möglich sind jpg, gif oder png. Je nach Ausgangstyp erfolgt eine
Konvertierung.

Farbtiefe legt man entweder die Anzahl der Farben oder die Anzahl
der Bit fuer die Farbinformationen des Bildes fest.
4 waeren z.B. 16 Farben, 8 - 256 Farben, 16 - 65.536 Farben usw.
Die Farbtiefe wird nur geaendert, wenn die Anzahl der Farben reduziert wird.

Qualitaet kann einen Wert zwischen 0 - 100 annehmen.
0 - hoechste Komprimierung, 100 - geringste Komprimierung
Kann nicht für alle Dateitypen funktionieren, da z.B. gif keine Kompri-
mierungsstufen kennt - sollte also in solch einem Fall einfach ignoriert
werden.

Schaerfe legt den Grad der Bildschaerfung fest.
Die Werte liegen zwischen 0 - 100.
0 - keine Schaerfung, 100 - maximale Schaerfung

Drehung kann das Bild nach rechts (positive Werte)
oder nach links (negative Werte) gedreht werden. Einheit: Grad.

Flip, wenn gleich 1, wird das Bild vertikal gespiegelt.

Subroutine:

sub min($,$) { return $_[0] < $_[1] ? $_[0] : $_[1]; }

sub IMG_CONVERT(%)
{
# %Hash = (
# FileHandle => "Wert1",
# BreiteMax => "Wert2",
# HoeheMax => "Wert3",
# PixDichte => "Wert4",
# Format => "Wert5",
# Farbtiefe => "Wert6",
# Qualitaet => "Wert7",
# Schaerfe => "Wert8",
# Drehung => "Wert9",
# Flip => "Wert10",
# BreiteAktuell => "Wert11", # (nur Rueckgabe)
# HoeheAktuell => "Wert12" # (nur Rueckgabe)
# );

use Image::Magick;
my ( %par ) = @_;
return %par if ( ! defined $par{ FileHandle } );
my $img = new Image::Magick;
$img->BlobToImage( ${$par{ FileHandle }} );
return unless defined ( $img->Get( 'magick' ) );
my ( $width, $height ) = $img->Get( 'width', 'height' );
my $max_width = ( defined $par{ BreiteMax } ? $par{ BreiteMax } : $width );
my $max_height = ( defined $par{ HoeheMax } ? $par{ HoeheMax } : $height );
if ( $width > $max_width || $height > $max_height ) {

# verkleinern
my $scale = &min( $max_width * $height, $max_height * $width );
my $new_height = int( $scale / $width ); # temp
$width = int( $scale / $height );
$height = $new_height;
$img->Scale( width => $width, height => $height );
}
$par{ BreiteAktuell } = $width;
$par{ HoeheAktuell } = $height;
if ( defined $par{ Schaerfe } && $par{ Schaerfe } ) {
$img->Sharpen( radius => 0, sigma => $par{ Schaerfe } / 4 );
}
if ( defined $par{ Flip } && $par{ Flip } > 0 ) {
$img->Flop();
}
if ( defined $par{ Drehung } && $par{ Drehung } != 0 ) {
$img->Rotate( $par{ Drehung } );
}
$img->Set( density => $par{ PixDichte } ) if defined $par{ PixDichte };
if ( defined $par{ Farbtiefe }
&& $img->Get( 'depth' ) < $par{ Farbtiefe } ) {
$img->Quantize( colors => ( 1 << $par{ Farbtiefe } ) );
}
$img->Set( magick => $par{ Format } ) if defined $par{ Format };
$img->Set( quality => $par{ Qualitaet } ) if defined $par{ Qualitaet };
${$par{ FileHandle }} = $img->ImageToBlob();
return %par;
}

Aufruf:

1. Subroutine

%ImgDaten =
&IMG_CONVERT(FileHandle=>\$ImgSource,BreiteMax=>400,HoeheMax=>400,Format=>'gif');

Die nicht übergebenen Werte nehmen die Voreinstellungen an.

Die Subroutine muss im Programmtext gespeichert sein.

2. Modul

A:Speichern Sie das Modul in Ihrem Perlverzeichnis unter

/usr/bin/perl/lib/EIGEN/Image/PL0009.pm (Linux)

c:\Perl\lib\EIGEN\Image\PL0009.pm (Windows)

B: Fügen Sie in den Kopf Ihres Perl-Programmes folgende Zeile ein:

use EIGEN::Image::PL0009 qw(IMG_CONVERT);

C: So rufen Sie die Subroutine auf:

%ImgDaten =
&IMG_CONVERT(FileHandle=>\$ImgSource,BreiteMax=>400,HoeheMax=>400,Format=>'gif');
# ohne "&" korrekt!

Die nicht übergebenen Werte nehmen die Voreinstellungen an.

Die Subroutine muss nicht im Programmtext gespeichert sein.

3. Hinweis

Voreinstellungen:

BreiteMax => '256',
HoeheMax => '256',
PixDichte => '72',
Format => 'jpg',
Farbtiefe => '16',
Qualitaet => '50',
Schaerfe => '20',
Flip => '0',
Drehung => '0'