Schrift
[thread]6598[/thread]

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

Leser: 2


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
renee
 2004-12-27 01:17
#50344 #50344
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich versuche gerade, ein kleines Skript zu schreiben, mit dem ich ein paar Photoshop-Sachen automatisieren kann.

Ich habe noch nie mit Win32::OLE gearbeitet.

Ich habe mal testweise einfach nur folgenden Code:
Code: (dl )
1
2
3
4
5
6
#! /usr/bin/perl

use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Photoshop';


Aber ich bekomme folgende Fehlermeldung:
Quote
No type library matching "Photoshop" found at ps_skript.pl line 6
Win32::OLE(0.1502): GetOleTypeLibObject() Not a Win32::OLE::TypeLib object at c:/wampp1/perl/site/lib/Win32/OLE/Const.pm line 45.


Diese TypeLibrary.tlb befindet sich in dem gleichen Ordner wie die Photoshop.exe

Muss ich irgendwo etwas einstellen??

Quote
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)


OS: WinXP
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/
renee
 2004-12-27 02:00
#50345 #50345
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dieses Problem ist gelöst. Die Doku von Const.pm hat mich darauf gebracht statt einfach 'Photoshop' - wie es in mehreren Skripten stand - mal 'Adobe Photoshop' zu benutzen. Und jetzt geht's!
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/
renee
 2004-12-27 02:10
#50346 #50346
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kann ich irgendwie eine Liste der Funktionen der Programme finden, die ich so ansteuern will?

Ich habe aktuell das Problem, dass ich mit folgendem Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#! /usr/bin/perl

use strict;
use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Adobe Photoshop';


my $ps = Win32::OLE->new('Photoshop.Application') or die $!;
[...]

$d1->PutBoolean(phKeyLowercase, 1);
[...]


folgende Fehlermeldung bekomme:
Quote
Bareword "phKeyLowercase" not allowed while "strict subs" in use at ps_skript.pl line 46.
Execution of ps_skript.pl aborted due to compilation errors.


So habe ich es aber in einem Stück Code vor mir liegen. Es kann durchaus sein, dass dieses Stück Code schon älter ist und vielleicht durch etwas anderes ersetzt werden muss!
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/
Cremator
 2004-12-27 15:27
#50347 #50347
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Das Problem ist eher das die genaue Schreibweise der Funktions- und Konstantennamen zu beachten ist. Das Geraet nennt sich "phKeyLowerCase", also grosses C.

Zum Durchsuchen der TLBs koenntest Du z.B. diese Shareware hier benutzen: http://www.softilium.com/tlbview/index.htm oder als Notloesung das File einfach mit einem Hex-Editor aufmachen, die Namen stehen da als Klartext drin (ist allerdings sehr unuebersichtlich).
renee
 2004-12-28 00:27
#50348 #50348
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe bei den Perlmonks richtig gute Hilfe bekommen (Using Photoshop via Perl)...

So komme ich an die Liste mit den Konstanten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl -wl

package ap;

use Win32::OLE::Const "Adobe Photoshop";

package main;

$, = $/;

print sort grep defined *{"ap::$_"}{"CODE"}, keys %ap::;


Und der Tipp mit dem "großen C" war goldrichtig! Jetzt funktioniert es einwandfrei!
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/
Crian
 2005-01-03 17:25
#50349 #50349
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=renee,27.12.2004, 01:10]Kann ich irgendwie eine Liste der Funktionen der Programme finden, die ich so ansteuern will?

Ich habe aktuell das Problem, dass ich mit folgendem Code:
Code: (dl )
$d1->PutBoolean(phKeyLowercase, 1);


folgende Fehlermeldung bekomme:
Quote
Bareword "phKeyLowercase" not allowed while "strict subs" in use at ps_skript.pl line 46.
Execution of ps_skript.pl aborted due to compilation errors.


So habe ich es aber in einem Stück Code vor mir liegen. Es kann durchaus sein, dass dieses Stück Code schon älter ist und vielleicht durch etwas anderes ersetzt werden muss![/quote]
Änder das Komma in ein => oder setz den Befehlsnamen in Anführungsstriche.\n\n

<!--EDIT|Crian|1104767671-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2005-01-03 17:39
#50350 #50350
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nee, das stimmt schon. Der Tipp von Cremator war schon richtig. Ich kann ja heute abend mal den Code posten, den ich jetzt habe. Da besteht immer noch ein kleines Problem, was der Funktionalität aber nicht schadet...
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/
Crian
 2005-01-03 17:53
#50351 #50351
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ob Dein Name richtig oder falsch ist, spielt doch an der Stelle gar keine Rolle. Da steht ein bareword, also meckert perl mit use strict.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
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/
Crian
 2005-01-03 20:13
#50353 #50353
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Achso. (use constant PI => 3.14....;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2004-12-27 01:17.