Schrift
[thread]39[/thread]

Bilder mit Perlscript ausgeben



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Free Faq
 2003-09-15 11:36
#3547 #3547
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Bin jetzt in der Arbeit, habe deshabl mein Script gerade nciht da. Na jedenfalls versuche ich schon seid einiger Zeit ein Bild mit einem Perlscript in eine Variable zu speichern und diese dann mti dem Script Z.B.: pics.cgi?name=blank.gif
Habe das ganze auch in dem IMG Tag geschrieben aber es kommt immer das Bild, das er das Bild nicht finden konnte.
Habt ihr ein Script, für das was ich brauche? Ich will nämlich, das
1. Man nciht sieht, wo die Bilder gespeichert sind
2. Man mit dem Script erlaubnisse verteilen soll. (Kann ich später selber hinzufügen.)

Hofe ihr wisst, was ich meine.
gruss Free Faq
Haut mich nicht, ich bin ein Noob!
Dubu
 2003-09-15 12:33
#3548 #3548
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Kann es sein, dass du entweder den Content-type-Header vor den Daten oder binmode() fuer Bilddatei und STDOUT vergessen hast?
Free Faq
 2003-09-15 13:59
#3549 #3549
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Hmm ahjo! Ich glaub ich hab binmode vergessen! Muss ich heut abend mal ausprobieren. :)
Haut mich nicht, ich bin ein Noob!
Free Faq
 2003-09-15 19:52
#3550 #3550
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Hmm doch nicht :(
Hier mal der Quellcode:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
use strict;


open(IMAGE, "image.gif");
        binmode(IMAGE);
        my $Data = <IMAGE>;
close(IMAGE);

print "Content-type: image/gif\ n\ n";
print $Data;
\n\n

<!--EDIT|Free Faq|1063641186-->
Haut mich nicht, ich bin ein Noob!
coax
 2003-09-15 20:23
#3551 #3551
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Du liest nur eine Zeile aus der Datei
Code: (dl )
my $Data = <IMAGE>;

ändern in
Code: (dl )
my @Data = <IMAGE>;


jetzt nur noch der richtige Header und binmode auf die Standardausgabe
Code: (dl )
1
2
3
print "Content-type: image/gif\n\n";
binmode(STDOUT);
print @Data;


oder so
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;

my($image);

print "Content-type: image/gif\n\n";

open(IMAGE, '<image.gif') or die $!;
binmode(IMAGE);
{
       local $/;
       undef($/);
       $image = <IMAGE>;
}
close(IMAGE);

binmode(STDOUT);

print $image;


Den Bug im PERL-Code-Tags sollte man mal fixen :(\n\n

<!--EDIT|coax|1063643860-->
,,Das perlt aber heute wieder...'' -- Dittsche
Free Faq
 2003-09-15 20:48
#3552 #3552
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
THX es funtzt! Könntest Du mir das vielleicht genauer Erklähren?
Code: (dl )
1
2
3
4
5
{
      local $/;
      undef($/);
      $image = <IMAGE>;
}


Hab einwenig rumgetestet und folgendes rausbekommen, was auch funktioniert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;

open(IMAGE, "image.gif");
binmode(IMAGE);
    my @image = <IMAGE>;
binmode(STDOUT);
close(IMAGE);


print "Content-type: image/gif\n\n";
print @image;

Hat mein Script irgendein Nachteil deins gegenüber? Oder kann ich das ohne Sorgen verwenden?\n\n

<!--EDIT|Free Faq|1063644600-->
Haut mich nicht, ich bin ein Noob!
coax
 2003-09-15 20:59
#3553 #3553
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
undef($/);
setzt den $/ (Input-Record-Separator) auf undef.
$/ bestimmt welches Trennzeichen für Eingabedaten verwendet werden soll, ist standardmäßig auf \n (Zeilenumbruch) gesetzt.
Die ganze Aktion ermöglicht uns die Datei in einem Stück einzulesen (in ein Skalar statt in ein Array).

Das würde auch so funktionieren
Code: (dl )
1
2
3
open(FH, $file) or die $!;
my $content = join('', <FH>);
close(FH);


Die geschweiften Klammern und local veranlassen, dass sich das Ändern von $/ nicht auf das gesamte Skript auswirkt.

siehe
perldoc perlvar



Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
use strict;

open(IMAGE, "image.gif");
binmode(IMAGE);
my @image = <IMAGE>;
close(IMAGE);


print "Content-type: image/gif\n\n";
binmode(STDOUT);
print @image;


binmode() würde ich hinter den Header schreiben, aber ansonsten funktionierts genauso.\n\n

<!--EDIT|coax|1063645385-->
,,Das perlt aber heute wieder...'' -- Dittsche
[E|B]
 2003-09-15 21:18
#3554 #3554
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mit GD ist auch schön:

Code: (dl )
1
2
3
4
5
6
7
8
9
use strict;
use warnings;
use GD;

my $image = newFromJpeg GD::Image('image.jpg');
binmode(STDOUT);

print "Content-type: text/html\n\n";
print $image->jpeg;
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Dubu
 2003-09-15 23:06
#3555 #3555
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@[E|B]: Das ist eine der ineffizientesten Methoden, die moeglich ist. Erst wird das Bild von JPEG in die interne Darstellung von GD gewandelt und anschliessend wieder zurueck. Man hat dabei nicht mal das gleiche Bild, da
1.) GD intern nur mit 8 Bit arbeitet, ein JPEG aber 24 Bit haben kann;
2.) JPEG-Kompression verlustbehaftet ist, d.h. es geht sowieso Information verloren.
[E|B]
 2003-09-15 23:12
#3556 #3556
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ja, wenn man all diese Faktoren berücksichtigt, ist die erste Methode natürlich wesentlich effizienter. Mich wundert es nur immer, woher du das alles weiß! Unglaublich! *lol* :D
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2003-09-15 11:36.