Zweifache Grafikausgabe
Nadine
- perl
Hallo Leute,
ich hab das unten angezeigtes Unterprogramm Zeige_bild:
sub Zeige_bild
{
$file = $_[0];
$teilbildgroesse = 1024;
open(BILD, $file);
binmode(BILD);
binmode(STDOUT);
while(read(BILD, $teilbild, $teilbildgroesse))
{ print $teilbild;
}
close(BILD);
}
Nun versuche ich mit den folgenden Aufrufe von Zeige_bild
zwei Bilder nebeneinander auf der Seite zu zeigen.
print "Content-type: image/jpeg\n\n";
&Zeige_bild('bild_1.jpg');
&Zeige_bild('bild_2.jpg');
Doch ich bekomm nur das bild_1.jpg zu sehen, ich will aber beide darstellen.
Wie macht man das, ohne das man externe Module wie GD.pm benutzn muß!
Oder geht das gar nicht mit dem Unterprogramm Zeige_bild.
Danke, Danke!!!
Gruß Nadine
Hallo Nadine,
sub Zeige_bild
{
$file = $_[0];
$teilbildgroesse = 1024;
open(BILD, $file);
binmode(BILD);
binmode(STDOUT);
while(read(BILD, $teilbild, $teilbildgroesse))
{ print $teilbild;
}
close(BILD);
}
Dieser COde ist zwar grundsätzlich o.k., ich würde es jedoch ein bißchen anders machen.
Hier mein Vorschlag:
-----------------------------------------------------------------------------------
use strict; # Variablen müssen deklariert werden, sonst schimpft der Interpreter
sub Zeige_bild
{
my($file) = @_; # durch das 'my' wird '$file' deklariert, und ist nur in der Funktion sichtbar,
# was zu weniger Nebeneffekten führt
local(*BILD); # Filehandles können nicht mit 'my' deklariert werden. dieses 'local' ist jedoch besser als nichts.
open(BILD,$file) or &print_error_and_exit("Nix da mit dem Bild $file",$!);
# open kann auch schiefgehen, sollte abgefangen werden
binmode(BILD); # eigentlich nur unter Windows notwendig, aber
# 'nutzts nix, dann schadets auch nix'
binmode(STDOUT); # mach ich eigentlich nie, auch nicht unter Windows
print "Content-type: image/jpeg\n\n";
print while(<BILD>); # die sache mit dem 'read' ist eigentlich hier nicht notwendig
close(BILD);
}
-----------------------------------------------------------------------------------
noch besser wäre m.E. (in Hinblick auf ein eventuell eingesetztes mod_perl)
-----------------------------------------------------------------------------------
use strict;
use IO::File;
sub Zeige_bild
{
my($file) = @_;
my($fh) = IO::File->new($filename)
or &print_error_and_exit("Nix da mit dem Bild $file",$!);
print "Content-type: image/jpeg\n\n";
print while(<$fh>);
close($fh);
}
-----------------------------------------------------------------------------------
Nun versuche ich mit den folgenden Aufrufe von Zeige_bild
zwei Bilder nebeneinander auf der Seite zu zeigen.
print "Content-type: image/jpeg\n\n";
&Zeige_bild('bild_1.jpg');
&Zeige_bild('bild_2.jpg');Doch ich bekomm nur das bild_1.jpg zu sehen, ich will aber beide darstellen.
Wie macht man das, ohne das man externe Module wie GD.pm benutzn muß!
Oder geht das gar nicht mit dem Unterprogramm Zeige_bild.
Das geht nicht! Du willst zwei Bilder quasi zu einem verschmelzen, das kann aber so nicht funktionieren.
Eine Grafik-Datei hat auch ein bestimmtes Format, wobei am Anfang einige Angaben zum internen Aufbau des Bildes (Format, Größe, Farben, Palette oder was auch immer) angegeben sind.
Ein Programm, welches dieses Bild darstellt, wertet diese Angaben aus, um das Bild korrekt darstellen zu können.
Ein Bild, welches aus beiden Bildern bestehen würde, hat eben andere Angaben zu machen als Dein Bild 1.
Und selbst wenn es irgendwie gehen würde, würdest du Dir nicht sicher sein können, daß die Bilder auch _nebeneinander_ dargestellt werden.
Ich bin mir nicht sicher, aber ich glaube GD.pm wäre mit einer solche Aufgabe auch überfordert.
Warum machst Du das nicht im aufrufenden HTML-Code. Zwei Img-Tags und Du kanstt die Bilder hingeben, wo Du willst. Ist im Prinzip einfacher und ohne Tricks.
Grüße
Klaus
Hallo Nadine,
hab ich recht, Du willst einen Counter Programmieren? ;-)
Das Problem ist, dass in einem Bild die Informationen ueber groesse etc. fest eingespeichert sind. Ich habe im Web eine Loesung gefunden, die die Grafiken komplett neu generiert:
Die einzelnen Ziffern sind dazu Hexadezimal codiert:
@digits = ("3c 66 66 66 66 66 66 66 66 3c", # 0
"30 38 30 30 30 30 30 30 30 30", # 1
"3c 66 60 60 30 18 0c 06 06 7e", # 2
"3c 66 60 60 38 60 60 60 66 3c", # 3
"30 30 38 38 34 34 32 7e 30 78", # 4
"7e 06 06 06 3e 60 60 60 66 3c", # 5
"38 0c 06 06 3e 66 66 66 66 3c", # 6
"7e 66 60 60 30 30 18 18 0c 0c", # 7
"3c 66 66 66 3c 66 66 66 66 3c", # 8
"3c 66 66 66 66 7c 60 60 30 1c"); # 9
Daraus wird dann der Bitcode erzeugt:
# convert counter to bytes
$count = $totalReads;
@bytes = ();
$len = length($count);
$formattedCount = sprintf("%0${len}d",$count);
for ($y=0; $y < 10; $y++)
{
for ($x=0; $x < $len; $x++)
{
$digit = substr($formattedCount,$x,1);
$byte = substr($digits[$digit],$y*3,2);
push(@bytes,$byte);
}
}
Und alles an den Browser geschickt:
print "Pragma: no-cache\n";
print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n";
print ("Content-type: image/x-xbitmap\n\n");
printf ("#define count_width %d\n#define
count_height 10\n", $len*8);
printf "static char count_bits[] = {\n";
for($i = 0; $i < ($#bytes + 1); $i++)
{
print("0x$bytes[$i]");
if ($i != $#bytes)
{
print(",");
if (($i+1) % 7 == 0)
{
print("\n");
}
}
}
print("}; \n\n");
Funktioniert wunderbar (ein kleines Problem mit dem IE hatte ich, weil der immernoch 30 Sekunden auf weitere Daten wartet, bevor er alles anzeigt. Das kann man aber mit printf "jede Menge Muell hinschicken ... [...]"; beheben.
So bekommst Du dann auch zwei Grafiken nebeneinander, weil der die width selbst berechnet ...
Vielleicht hilfts Dir ja :-)
Gruss aus London,
Chris