| Überblick
Im folgenden möchten wir Ihnen eine kleine Klasse vorstellen, mit der Sie ohne Einsatz zusätzlicher Komponenten den Typ sowie die Abmessungen von Bildateien bestimmen können. Derzeit werden GIF- und JPG-Dateien unterstützt, die Klasse wurde jedoch so gestaltet, dass Sie ohne grossen Aufwand weitere Dateiformate integrieren können.
Die Klasse wurde in JScript realisiert, kann aber selbstverständlich sowohl in JScript als auch in VBScript verwendet werden.
Wo stehen die Informationen über Bildtyp und Abmessungen?
Der Bildtyp läßt sich in der Regel aus den ersten Zeichen einer Datei, der sogenannten Signatur, bestimmen, GIF-Dateien beginnen mit der Zeichenkette 'GIF', JPG-Dateien werden durch die Bytefolge $FF$D8 eingeleitet. Der Bildtyp kann also ganz einfach wie folgt bestimmt werden:
FSO = Server.CreateObject('Scripting.FileSystemObject')
File = FSO.OpenTextFile(FileName);
strData = File.Read(3);
if (strData = 'GIF')
...
Etwas schwieriger gestaltet sich die Bestimmung der Breiten- und Höhenangabe. Bei den meisten Bildformaten befinden sich diese Informationen an festen Positionen, so stehen diese Informationen bei GIF-Dateien in den Bytes 7 - 10 der Datei, nach dem Auslesen der Signatur (s.o.) und dem Überspringen der Versionsangabe (3 Byte) können wir die Breite und Höhe daher direkt bestimmen:
File.Skip(3);
strData = File.Read(4);
intWidth = Ascii(strData.charAt(0)) + 256 * Ascii(strData.charAt(1))
intHeight = Ascii(strData.charAt(2)) + 256 * Ascii(strData.charAt(3))
Zur Umwandlung der einzelnen Zeichen in ihren ASCII-Wert verwenden wir die in VBScript erstellte Hilfsfunktion 'ASCII':
function Ascii(ch)
Ascii = asc(ch)
end function
Das JPG-Format ist etwas komplizierter aufgebaut; hier werden die Informationen in Blöcken gespeichert, deren Größe und Anzahl variabel ist. Jeder Block wird durch eine eindeutige Kennung eingeleitet und enthält direkt nach dieser seine Größe. Anhand dieser Angaben können wir uns durch die Datei hangeln, bis wir den Block gefunden haben, der die Informationen zur Bildgröße enthält:
while (!Found){
strData = File.Read(2);
if (Ascii(strData.charAt(0)) == 255 && (Ascii(strData.charAt(1)) >= 192 && (Ascii(strData.charAt(1)) <= 195))){
// Block gefunden
Found = true;
strData = File.Read(7);
intWidth = 256 * Ascii(strData.charAt(5)) + Ascii(strData.charAt(6));
intHeight = 256 * Ascii(strData.charAt(3)) + Ascii(strData.charAt(4));
} else {
// Block ueberspringen
strData = File.Read(2);
File.Skip(256 * Ascii(strData.charAt(0)) + Ascii(strData.charAt(1)) - 2);
}
}
Um das ganze etwas übersichtlicher zu gestalten und eine einfache Erweiterung auf zusätzliche Dateiformate zu ermöglichen, haben wir eine Klasse erstellt, die die beschriebene Funktionalität enthält. Sie können sich diese Klasse im Quelltext hier herunterladen.
Verwenden der Klasse
Die Anwendung der Klasse ist sehr einfach, unterscheidet sich allerdings je nach verwendeter Script-Sprache etwas.
Beispiel für JScript:
<%@ Language=JScript %>
<!-- #include file="ImageData.asp" -->
<%
var ImgData;
ImgData = new cImageData(Server.MapPath('nogetec.gif'));
Response.Write('<br>Typ: ' + ImgData.GetType());
Response.Write('<br>Breite: ' + ImgData.GetWidth());
Response.Write('<br>Hoehe: ' + ImgData.GetHeight());
%>
Beispiel für VBScript:
<%@ Language=VBScript %>
<!-- #include file="ImageData.asp" -->
<%
dim ImgData
set ImgData = ImageData(Server.MapPath("nogetec.gif"))
Response.Write "<br>Type: " & ImgData.GetType()
Response.Write "<br>Width: " & ImgData.GetWidth()
Response.Write "<br>Height: " & ImgData.GetHeight()
%> |