Thread Mit Perl auf Photoshop zugreifen: meine ersten Win32::OLE-Versuche (17 answers)
Opened by renee at 2004-12-27 01:17

renee
 2005-01-03 19:42
#50352 #50352
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Da steht nur ein Bareword, weil es das phLowercase nicht gibt. phLowerCase wird dagegen als Konstante durch use Win32::OLE::Const 'Adobe Photoshop'; geladen.

Kannst Du auch selbst machen, indem Du Konstanten in einem Deiner Module definierst und dann in den Namensraum des Skripts exportierst!

Deswegen ist es schon ganz wichtig, wie es geschrieben wird...

Hier übrigens mein Code..
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#! /usr/bin/perl

use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Adobe Photoshop';
use File::Spec;
use Getopt::Long;

my ($dir,$size) = ('./',350);

GetOptions('-d=s' => \$dir,
'-s=n' => \$size,);

opendir(DIR,$dir) or die $!;
my @files = grep{$_ !~ /^\.\.?$/}readdir(DIR);
closedir DIR;

foreach my $image_file(@files){

$image_file = $dir.'/'.$image_file;

# start photoshop
my $ps = Win32::OLE->new('Photoshop.Application') or die $!;
$ps->{Visible} = 0;

# open image
my $desc = $ps->MakeDescriptor();
my $control = $ps->MakeControlObject();
$desc->PutPath(phKeyNull,$image_file);
$control->Play(phEventOpen,$desc,phDialogSilent);

# autolevels
$desc = $ps->MakeDescriptor();
$control = $ps->MakeControlObject();
$desc->PutBoolean(phKeyAuto, 1);
$control->Play(phEventLevels,$desc,phDialogSilent);

# resize image
$desc = $ps->MakeDescriptor();
$control = $ps->MakeControlObject();
$desc->PutUnitDouble(phKeyWidth, phUnitPixels, $size);
$desc->PutBoolean(phKeyConstrainProportions, 1);
$desc->PutEnumerated(phKeyInterfaceIconFrameDimmed,phTypeInterpolation,phEnumBicubic);
$control->Play(phEventImageSize,$desc,phDialogSilent);

$control = $ps->MakeControlObject();
my $d1 = $ps->MakeDescriptor();
my $d2 = $ps->MakeDescriptor();
$d2->PutEnumerated(phKeyPNGInterlaceType,phTypePNGInterlaceType,phEnumPNGInterlaceNone);
$d2->PutEnumerated(phKeyPNGFilter,phTypePNGFilter,phEnumPNGFilterAdaptive);
$d1->PutObject(phKeyAs,phClassPNGFormat,$d2);

(my $outfile = File::Spec->rel2abs($image_file)) =~ s/\.+[^\.]+$/_thumb${size}.png/;
print $outfile,"\n";

$d1->PutPath(phKeyIn,$outfile);
$d1->PutBoolean(phKeyLowerCase, 1);
$control->Play(phEventSave,$d1,phDialogSilent);

$desc = $ps->MakeDescriptor();
$control = $ps->MakeControlObject();
$control->Play(phEventClose,$desc,phDialogSilent);
}


Jetzt habe ich nur noch das Problem, dass nach dem Beenden des Skripts Photoshop immer noch im TaskManager auftaucht. Es wird also anscheinend nicht richtig beendet.

Das ist jetzt nicht wirklich tragisch, da ich das ohne Probleme manuell beenden kann, aber wenn einer ne Lösung hat, wäre ich dankbar!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread Mit Perl auf Photoshop zugreifen: meine ersten Win32::OLE-Versuche