Bildgröße Druckversion
Bildtyp und -größe bestimmen Mi, 10.07.2002
Autor: Olaf Lüder

Ü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()
%>


Fragen, Anregungen

Wenn Sie Fragen oder Anregungen zu diesem Beitrag haben, wenden Sie sich bitte direkt an den Autor, die E-Mail-Adresse finden Sie am Anfang des Artikels.

© 2001, 2002 NOGETEC GmbH - Alle Rechte vorbehalten. - Impressum
Der Inhalt dieser Seiten ist urheberrechtlich geschützt. Texte, Grafiken und Dateien dürfen ohne unsere schriftliche Genehmigung - auch auszugsweise - nicht kopiert, vervielfätigt oder vertrieben werden.
Übersicht
13 Beiträge
in 11 Kategorien

ASP classic (7)
ASP.NET (0)
Komponenten (2)
ISAPI-Filter (4)
Konfiguration (0)
No more Cookies
ASP Sessions
ohne Sitzungscookies

Sie nutzen das integrierte Session-Objekt?
Ihre Kunden akzeptieren aber keine Cookies?

Wir haben die Lösung...
Load me up
ASP Fileupload
ohne Komponenten

Sie möchten Dateien auf den Server heraufladen,
ohne Komponenten zu installieren?

Gar kein Problem...
Little Secrets
Dateinamen & Parameter
im URL verbergen

Verschiedene Pfade auf eine Datei abbilden...?
Skriptnamen weglassen, Parameter verstecken...?

So funktioniert's ...
Lost in Space
Recordsets
auf Abwegen

Sie nutzen Datenbanken & ADO-Recordsets...?
Die Performance ist aber nicht befriedigend...?

Dann lesen Sie weiter...
Subdomains
Subdomains einrichten
ohne viel Aufwand

Sie möchten Subdomains verwenden, mit eigenen Verzeichnissen aber ohne extra Host-Header oder Web-Sites einzurichten?

Wir zeigen Ihnen wie...